【ThinkingInC++】45、比较const和非const成员函数的例子

/**
* 书本:【ThinkingInC++】
* 功能:旧代码中的enum hack
* 时间:2014年9月10日08:35:13
* 作者:cutter_point
*/

#include<iostream>
#include<ctime>
#include<cstdlib>

using namespace std;

class Bunch
{
    enum {size=1000};
    int i[size];
};

int main()
{
    cout<<"sizeof(Bunch)="<<sizeof(Bunch)
        <<", sizeof(i[1000])="
        <<sizeof(int[1000])<<endl;

    return 0;
}

/**
* 书本:【ThinkingInC++】
* 功能:比较const和非const成员函数的例子
* 时间:2014年9月10日08:35:36
* 作者:cutter_point
*/

#include<iostream>
#include<cstdlib>   //里面有随机函数rand的头文件
#include<ctime>     //获取系统时间,为了更改随机数的种子机制

using namespace std;

/*
srand和rand()配合使用产生伪随机数序列。
rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,
rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,
每次调用rand函数生成的伪随机数序列都是一样的。
srand(unsigned seed)通过参数seed改变系统提供的种子值,
从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。
*/
class Quoter
{
    int lastquote;
public:
    Quoter();
    int lastQuote() const;
    const char* quote();
};

Quoter::Quoter()
{
    lastquote=-1;
    srand(time(0)); //更改随机数的种子
}

int Quoter::lastQuote() const    //这个const是为了使这个函数无法改变成员变量
{
    return lastquote;
}

const char* Quoter::quote()
{
    static const char* quotes[]=    //static const类型是:所有的对象共享且不变的数据。
    {
        "Are you having fun yet?",
        "Doctors always know best",
        "Is it ... Atomic?",
        "Fear is obscene",
        "There is no scientific evidence",
        "to support the idea",
        "that life is serious",
        "Things that make us happy, make us wise",
        "cutter_point"
    };
    const int qsize=sizeof(quotes)/sizeof(*quotes); //求得长度
    int qnum=rand()%qsize;  //rand()根据种子产生随机数

    while(lastquote >= 0 && qnum == lastquote)
        qnum=rand()%qsize;  //避免连续出现相同的数据

    return quotes[lastquote=qnum];

}

int main()
{
    Quoter q;
    const Quoter cq;
    cq.lastQuote();
    //! cq.quote(); //这个只是返回值是const的,但不是const函数

    for(int i=0 ; i<20 ; ++i)
        cout<<q.quote()<<endl;

    return 0;
}
时间: 2024-10-16 18:24:01

【ThinkingInC++】45、比较const和非const成员函数的例子的相关文章

const修饰类的成员函数

<Effective C++>里面说,尽量使用const,const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当const修饰类的成员函数时,成员函数有什么特点. 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函

用 const 限定类的成员函数

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const.所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员:没有 const 修饰的成员函数,对数据成员则是可读可写的.

const关键字对C++成员函数的修饰

const对C++成员函数的修饰分为三种:1. 修饰参数:2. 修饰返回值:3. 修饰this指针.简述一下知识点如下,以后找功夫再完善. 1. 对函数参数的修饰. 1)const只能用来修饰输入参数.输出型参数不能用const来修饰. 2)如果输入参数采用"指针传递",那么加const修饰可以防止意外地改动该指针,起到保护作用. 3)如果输入参数采用"值传递",函数将产生临时变量(局部变量),复制该参数的值并且压入函数栈.函数中使用该参数时,访问的是函数栈中临时变

C++的const类成员函数

转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, [cpp] view plain copy const char blank = ''; blank = '\n';  // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器

【转】C++的const类成员函数

我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数).例如, const Screen blankScreen;  //Screen为class,

(转)函数后面加const--C++ const成员函数

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const.所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员:没有 const 修饰的成员函数,对数据成员则是可读可写的.

const 成员函数

我们知道,在成员函数中,如果没有修改成员变量,应该给成员函数加上 const 修饰符,例如 1 #include <iostream> 2 3 using namespace std; 4 5 class Foo 6 { 7 public: 8 Foo(int x) : _x(x) {} 9 int getX() const { return _x; } 10 private: 11 int _x; 12 }; 13 14 int main() 15 { 16 Foo f(1); 17 cou

C++中基于成员函数是否是const重载成员函数

C++pimer中文版第四版 378页 基于const的重载 如果我们要在一个类的成员函数中定义两个函数签名完全一样的成员函数,比如display,那么可以基于是否是const成员函数来重载.比如: //非const对象可以使用可以使用任意成员,但是下面这个匹配的更好,所以一般用这个成员函数 Screen& display(ostream& os){ os << "something"; return *this;//返回的是普通引用 Screen&

非const引用不能指向临时变量

没找到具体原因,MSDN看到下面这句,VC是从2008才有这一限制的,感觉就是从语法上对临时变量增加了限定,因为一般说来修改一个临时变量是毫无意义的,通过增加限定,强调临时变量只读语义.虽然实际上修改临时变量并不会有问题. Visual Studio 2008 In previous releases of Visual C++, non-const references could be bound to temporary objects. Now, temporary objects ca