c++学习笔记(三)const详解

c和c++const的一点区别

c语言中的const 应该叫做 read-only
c++中的const 是真正的const

 * c++const 是真正的const, 不会被指针变量所改变
 * 而c语言可以 类似
 * const int a = 3;
 * int *p = (int *)&a;
 * *p = 5;
 * 打印会发现 *p = a = 5;
 *
 * 然而c++   *p=5  a还是等于3
 * 因为c++ const值记录在符号标,是真正的常量,
 * a的值不会发生改变

下面讲讲c++区别于c的const其他特性

const引用传参数

class A
{
public:
    A(){cout << "construct" << endl;}
    A(const A &a){cout << "copy construct" << endl;}
    const A& operator=(const A &a){cout << "fuzhi=" << endl;}
    ~A(){cout << "~A" << endl;}

    /*const 引用*/
    //void test(const int &x); //写成这样提高效率?
    //完全没必要,写成下面这样就好,
    //虽然说是传引用, 但是int这种内部数据类型不存在构造析构过程,
    //复制也非常快, "值传递" 和 "引用传递"效率几乎一样
    void test(int x);        //goot
    void testA(A a);         //not good
    void testB(const A &a);  //good
};

/**************** 关于const 引用传值 传对象的问题****************/
int main()
{
    A a;
    int x = 3;

    /*分别取消注释其中某一行代码看运行结果*/
    a.test(x);     //1次构咋, 1次析构
    //a.testA(a);    //1次构造, 1次拷贝构造, 两次析构 
    //a.testB(a);    //1次构造, 1次析构

    /*所以对与内部数据类型不需要const int &x
    * 对于对象,则最号传引用 const A &a 效率高
    */
    return 0;
}

const返回值(放在函数前)

/*虽然用了const  但是然并卵, 返回值是一份拷贝
const没有起到任何效果
同理不要把 A GetA(void)  写成 const A GetA(void) A为某个数据类型*/
const int funA(void)
{
    return 3;
}

/*返回指针用const, 表示指针的内容不能修改
只能用const 类型指针来接收返回值*/
const int * funp(void)
{
    return NULL;
}

int main1()
{
    int a = funA();         //ok  but not good
    const int b= funA();    //ok  but not good

    //int *pa = funp();     //bad  把const类型赋值给非const类型是不ok的
    const int *pb = funp();

    /*下面这个例子, 我们需要看赋值重载函数是否在const */
    //const A& operator=(const A &a){cout << "fuzhi=" << endl;}
    //没加const 下面两句都ok, 加了const (x = y) = z 不ok
    A x, y, z;
    x = y = z;
    //(x = y) = z;  //想一想为什么?
}

const成员函数(放在函数名后)

class B
{
public:
    /* const 成员函数 */
    int funA()
    {
        a = 3;      //ok
        //非const成员函数可以调用const成员函数
        cfunA();
        cfunB();
    }

    int cfunB()const {}
    int cfunA() const
    {
        //a = 3;   // bad  const成员函数不能修改数据成员
        //SIZE = 3;// bad  当然不ok  SIZE是const类型 不论哪里都不能变
        //funA();  // bad  不能调用非const成员函数
        cfunB();   // ok   调用的是const成员函数
    }
    B(int size):SIZE(size){}
private:
    int a;
    /*const 成员变量 
    *在类中声明变量为const类型,但是不可以初始化
    const常量的初始化必须在构造函数初始化列表中初始化,
    而不可以在构造函数函数体内初始化*/
    const int SIZE; 
};

int main()
{
    //任何不会修改数据成员的函数都应该声明为const类型
    //如果const成员函数不慎修改了数据成员, 调用了其他非const成员函数
    //编译器将指出错误

    B b(1);
    b.cfunA();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值