zoukankan      html  css  js  c++  java
  • C++中const使用注意要点(二)

    当const修饰类的成员变量

    1、const修饰类的非静态成员时必须在构造函数初始化列表上初始化;

    在构造函数内会提示表达式必须是可修改的左值,因为在构造函数内并不是初始化,仅仅是赋值,而const类型必须初始化。

    2、const修饰类的静态成员必须在定义的地方对它初始化,因为静态成员是无法在构造函数初始化列表上初始化的;

    当const修饰类的成员函数时

    1、用const修饰类的对象,那么该对象不能调用任何修改类成员的方法;

    2、把const放在成员函数后,比如void f() const {},那么该函数内不能修改类成员;

    例外1:可以将this指针强制转换成非const指针来在2的情况下改变类成员

    class Test
    {
    	int i;
    public:
    	Test(int ii = 0) : i(ii) {}
    	void f() const
    	{
    		((Test*)this)->i++;
    		(const_cast<Test*>(this))->i++;
    	}
    };
    

    例外2:使用mutable关键字,可以突破const的限制,被mutable修饰的变量将永远处于可变状态

    实际往往会使用类的常引用来作为函数参数,这样就不会修改成员变量的值,但是要注意的是调用的方法后必须声明const

    class MyClass
    {
    public:
        MyClass(int _val = 0);
        ~MyClass(void);
    
        int Get() { return val; }
    
    private:
        int val;
    };
    
    MyClass copy(const MyClass& bc)
    {
        int i = bc.Get();  // Error!
        return MyClass(i);
    }

    虽然我们知道Get函数不会改变成员变量,但是编译器不知道,这样它就会觉得你调用了可能改变成员变量的函数(Get)。

    产生非常常见的编译错误:

    error C2662: “MyClass::Get”: 不能将“this”指针从“const MyClass”转换为“MyClass &”
    1> 转换丢失限定符

  • 相关阅读:
    ios6.0,程序为横屏,出现闪退
    [ios]objective-c中Category类别(扩展类)专题总结
    iOS Dev (26) 初步了解下UIColor的最常用知识
    CGGeometry.h详解
    ipa验证错误问题总结
    UITableView和UITableViewCell的几种样式
    willRotateToInterfaceOrientation 屏幕旋转
    ios 使用第三方框架注意
    automaticallyAdjustsScrollViewInsets 使用
    contentSize、contentInset和contentOffset区别
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/5348424.html
Copyright © 2011-2022 走看看