目录
拷贝与引用
2 const限定符
3 const与指针
拷贝与引用
1)拷贝:即复制。在初始化变量时,初始值会被拷贝到新建的对象中。对象会开辟一块新的内存空间用来存储该变量。
int a = 10;
int b = a;
std::cout << "a的地址:" << &a << std::endl; // a的地址:000000E7EBEFFC04
std::cout << "b的地址:" << &b << std::endl; // b的地址:000000E7EBEFFC24
解释:以上代码中,a与b的值相等,但是a与b的地址并不相等,原因是执行b=a时,相当于b又开辟了一块新的内存空间来存储a中的值。
2)引用:即变量的别名,程序把变量与初始值直接绑定在一起,而非拷贝。引用时,必须初始化。
int a = 10;
int &b = a;
std::cout << "a的地址:" << &a << std::endl; // a的地址:0000007A67F0F6E4
std::cout << "b的地址:" << &b << std::endl; // b的地址:0000007A67F0F6E4
解释:以上代码中,同样a与b相等,同时a与b的地址也相等,这就免去了重新定义变量时要开辟新的内存空间。一定程度上节省了内存空间。
引用拓展:也可以在定义常量的时候,直接使用引用。
注意:const 必须要加。
2 const限定符
说明:const可防止程序修改某个变量的值。
const int a = 10;
a = 20;
解释:上述代码中,使用const修饰了a,并令a = 10,后面又想要将a修改为20,此时程序就会报错:
![](https://img-blog.csdnimg.cn/54b6708ec78a4a628c658bf53750ffe0.png)
如果,删除const关键字,程序便可顺利运行。这就是const起到了限制a变量在后期的程序中,防止被修改的作用。
如果不够明显,请看下面例子:
void showValue(int& val) {
val = 10000;
std::cout << val << std::endl; // 10000
}
int main()
{
int c = 100;
showValue(c);
std::cout << c << std::endl; // 10000
return 0;
}
解释:上述代码中,c的初始值是100,执行showValue函数以后,由于形参中没有const关键字,同时val使的是引用(即:val与c绑定在一起,地址相同),导致val修改了c的值为1000,所以最终c打印出来即为10000。
很多时候,我们并不希望调用一个函数以后,修改了我们的事先定义好的变量的值。
如果在形参中加入关键字const:
void showValue(const int& val) {
val = 10000;
std::cout << val << std::endl; // 10000
}
int main()
{
int c = 100;
showValue(c);
std::cout << c << std::endl; // 10000
return 0;
}
解释:由于形参中加入了const,程序就会报错。
![](https://img-blog.csdnimg.cn/27549f15c5564b4ab53b1005d8efb4ad.png)
程序会提示,val不能被修改,也就是c不能被修改。因为val和c是引用的关系。
3 const与指针
说明:指针指向的地址可以改变,但是不能通过解引用来修改指向的值。
语法:const 数据类型 * 变量名
-
一般用于修饰函数的形参:表示不希望在函数里通过解引用的方式修改内存地址中的值:void func(const int* no, string* str)
-
const修饰的指针所指向的变量可以改变(之前指向a,修改后指向b)
void func(const int* no) {
//*no = 12; // 说明1:ERR,不能通过指针(解引用),修改指向的常量
std::cout << "NO.=" << *no << std::endl; // NO.=13
}
int main() {
int a = 3;
const int* p = &a;
a = 13;
std::cout << "a = " << a << " *p = " << *p << std::endl; // a = 13 *p = 13
func(&a);
return 0;
}
2)指针常量
说明:可通过解引用修改所指向的值,但指针指向的地址不可改变。
语法:数据类型 * const 变量名
-
定义的同时必须初始化,否则没有意义
-
可通过解引用的方式修改内存地址中的值
int a = 3, b = 8;
int* const p = &a;
*p = 13; // *p = 13
// p = &b //说明1:如果让p重新指向b 会报错 ERR
3)常指针常量
语法:const 数据类型* const 变量名
说明:指向变量的对象不可改变,不能通过解引用的方法来修改内存中的值