【c++语法系列】【一】const详解

1.普通const变量初始化c++

int a = 9;
	const int ca = a;  // 非const赋值给const
	int b = a;         // const赋值给非const,若是是对象,则调用对象的operator=运算符,进行拷贝赋值
                       // b 是a的副本,b的修改不会影响到a,因此能够赋值

2.const引用变量函数

int a = 9;
	const int & ca = a;  // 非const变量赋值给const引用

	const int b = 9;
	const int &cb = b;   // const变量赋值给const引用

	int c = cb;          // const引用赋值给非const变量
	//int &cc = cb;      // error,const引用不能赋值给非const引用,一旦能够赋值,则能够经过cc修改cb的值,这就破坏了cb是const引用的定义

3.const变量作函数参数this

void f(int &a)
{
	cout << a << endl;
}

void fc(const int a)
{
	cout << "fc a=" << a << endl;
}

	int a = 9;
	const int & ca = a;  // 非const变量赋值给const引用

	fc(a);  // 非const值传递给const变量,实际上调用对象的拷贝构造函数A(A a);
	fc(ca); // const引用传递给const变量,两者都不会修改ca的值
	//f(ca);  // 将const引用传递给非const引用参数,能够经过参数a修改ca的值,因此违背了ca的const属性,error

总结一:const常量与非const常量之间能够随意传输,可是const引用不行。只能非const引用传给const引用,不能const引用传递给非const引用。指针

一句话原则:凡是能修改const变量值的作法,都是非法的。code

4.const成员函数对象

类的成员函数,若是不须要修改类的成员变量,通常设置为const。接口

class A
{
public:
	A(int age) {
		this->age_ = age;
	};
	int  get()const {  // const用于修饰this,表示当前对象this的属性值不会被修改
		return this->age_;
	}
	void set(const int &age) {  // const修饰入参,并非修饰this,因此this的属性能够被修改
		this->age_ = age;       // 调用对象的operator=方法,进行数据赋值。c++中,若是类没有定义operator=方法,编译器会默认合成一个。
	}
private:
	int age_;
};
int main(int argc, int * argv[])
{


	int a = 9;
	const int & ca = a;  // 非const变量赋值给const引用
	A tom(10);
	cout << tom.get() << endl;
	tom.set(ca);
	cout << "main" << endl;
	system("pause");
}

总结:const在工程中,通常有一下几个用法资源

一、定义常量,用于替代宏定义。get

二、普通函数的参数中的常量引用。编译器

三、成员函数的this指针设置为const。

四、成员函数的入参的常量引用。

 

在c++中,有两点须要注意

// A a;
	// A b;
	// a = b; 这里实际调用A的operator=方法,进行数据拷贝,若是A没有显示定义该方法,则编译器会自动合成一个operator=方法
// A a;
	/*
	void f(A a);
	f(a); 这里的参数时值传递,会调用A的拷贝构造函数,进行数据拷贝。A(A a);若是A没有显示定义该构造函数,则编译器会自动合成一个
	*/

因而可知,c++中对象的拷贝,其实是由这两个函数默默完成的,即便没有编写这两个接口。从某种意义上来说,这种默认的作法,就是为了这种函数参数值传递与对象赋值。可是,若是对象的属性存在指针,则会有问题,这会引出浅拷贝与深拷贝的概念;有些对象若是不想被拷贝,好比对象太大,拷贝太耗费资源,则能够删除这两个方法,使用=delete。这个后面会介绍。

相关文章
相关标签/搜索