01 const相关知识

  • C与C++不同点

    • 基本语法(const 引用 函数重载等)

    • 类(class)

    • c11新语法(匿名函数,智能指针,bind,function,cast等等)

  • 基本语法

    • bool关键字

      • 表示成功或者失败逻辑值
      • 占1个字节。true = 1 false = 0
    • const关键字

      • const常量必须赋初值
      • const常量值定义后不能改变(程序编译时期不能修改,运行时期可以修改)
      • 通过指针可以修改const常量的值,但是需要注意编译器优化
        int main()
        {
        	const int a = 5;
        	printf("a=%d\n", a);   //当程序运行到第4行,通过内存修改a的值,printf的结果依旧是5,因为编译器优化!即当程序运行到第3步,发现a是const常量,后面的a直接替换成了5!即printf("a=%d\n", 5); 
        	return 0;
        }
        
      • const在C语言中的表示是不可以修改值的变量,而C++中是常量
      • const在C++中定义的常量是内部链接,可以添加extern关键字修改为外部链接,一处定义,多处声明使用。在C语言中默认是外部链接,不需要添加extern关键字。
    • const + 指针

      • const Type* p /Type const* p(Type表示类型)表示不能修改指针指向的内容,指针本身的值是可以修改。
        const char* p="hello,world!\r\n";
        char const* q="hello,wolrd!\r\n"   //会自动编译成const char*
          p[0]='a';   //编译不通过,p指向的内容不能修改
          p="haohaoxuexi\r\n";  //编译通过,p可以重新指向其他字符常量
        
      • T* const 表示是该指针是一个常量,意味指针本身的值不能被修改,但是指针指向的内容可以修改。
        	char buf[32] = "hello,world\r\n";
        	char* const p = buf;
        	p[0] = 'a';      //编译通过,可以修改p指向的内容
        	p = nullptr;   //编译不通过,p不能指向其他地方
        
      • const T * const表示指针指向的内容及指针本身均不能改变。
        char buf[32]="hello,world\r\n";
        const char* const p=buf;
        p[0]='a';       //编译不通过
        p=nullptr;     //编译不通过
        
    • const_cast类型转换

      • 可以用于去除const修饰
        int main()
        {
        	const int a = 10;
        	int* p =&a;  //编译不通过,const int*不能转成int*
        	int* p = (int*)&a;    //编译通过。暴力强转!
        	int* q = const_cast<int*>(&a);    //编译通过!C++新建关键字const_cast代替暴力指针转换,更安全!
        	return 0;
        }
        

常成员函数——const加在最后

1)作用

  • 无法修改数据成员,一般用来修饰Get的函数

2)本质

  • 普通的类成员函数this指针类型:T* const(表示该指针不能被修改)
  • 常成员函数this指针类型:const T* const(表示指针指向的内容,且指针都不能修改)

3)意义

  • 让编译器提醒开发者该函数不能修改类的成员变量,用于const对象(引用或指针)
class Object
{
public:
	int GetNumber() const
	{
		m_number = 10;   //编译报错,不能修改m_number的值。原理:此时传入的this指针是
  //const Object* const类型,即m_number=10等价于this->m_number=10,不能修改!
		return m_number;
	}
	void SetNumber(int number)
	{
		m_number = number;
	}
private:
	int m_number;
};
int main()
{
	Object obj;
	int n=obj.GetNumber();
	return 0;
}

4)破除常成员函数的办法

  • 强转指针类型(将const T* const强转成T* const)
  • 在变量前加上mutable(关键字:多变的)
class Object
{
public:
	int GetNumber() const
	{
		Object* const p = (Object* const)this;    //方法1  强转
		p->m_number = 10;
		return m_number;
	}
	void SetNumber(int number)
	{
		m_number = number;
	}
private:
	 mutable int m_number;    //方法2  加关键字mutable
};

常成员变量——const加在最前

  • 必须声明时赋初值,否则编译不通过
  • 使用初始化列表(详情见10)
class Object
{
public:
Object():m_number2(40)    //初始化列表
{
	
}
private:
	const int m_number1=10;    //此方法不推荐,编译器版本低会报错
	const int m_number2;
};
int main()
{
	Object obj;
	return 0;
}
上一篇:翻译


下一篇:寒假自学python(第二篇---Python3 基础语法)