学习目标:
C++,从名字可以看出是C的升级版
,所以C里有的词汇它都有,我们认识以下C++独有的词汇。
想看C语言中的"磨人词汇",请看下面这个博文
C语言中的"磨人"词汇
学习内容:
- 引用 : 如示例所示
int &a = b;
,这跟C语言中的可不一样,这个&
它是在=
号左边出现的,所以跟C中的不一样,它表示 把a
定义为变量b
的别名,看例子。
int a = 10;
int &a1 = a;
a1 = 30;
cout<<a<<endl;
输出结果 :
30
结果分析 :
可以看到我们修改变量a1
的之,a却也发生了变化,这就很神奇。
使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数,引用的出现则解决了这个问题,即在内存中并没有产生实参的副本,它是直接对实参操作
- 常量引用 : 值不能变
int a = 10;
const int &a1 = a;
//报错,不能修改值
//a1 = 2;
//&a1 = b;
当了解了引用的作用了,我们这就来使用,不过要注意,当我的函数返回值是个引用的时候,不能返回局部变量的引用
,看下面你的例子就懂了
int &add(int a,int b){
int sum = a+b;
return sum;
}
int main() {
int sum1 = add(10,20);
cout<<sum1<<endl;
return 0;
}
这段代码就直接报错,不讲道理,为什么呢?因为当我们调用函数的时候,这时候就开始压栈,add函数压栈,执行完 返回了一个局部变量的引用,然后这个函数就出栈了
,你觉得我们add函数
里的局部变量sum
变量还在嘛?当然不在,然后当你使用这个返回值的时候,就肯定挂掉了,那咋办?唯一办法,不然它回收,让它生命周期长一点 就可以了
//全局变量sum
int sum;
int &add(int a,int b){
sum = a+b;
return sum;
}
int main() {
int sum1 = add(10,20);
cout<<sum1<<endl;
return 0;
}
输出结果:
30
小练习
int array[10];
int error = -1;
int &get(int index) {
if (index >= 0 && index < 10){
return array[index];
}
cout<<"index out of length!";
return error;
}
int main() {
get(5) = 30;
cout << get(5) << endl;
return 0;
}
代码解释: 以上代码就是对数组的下标为5的元素赋值30,这个花里胡哨,其实你可以直接array[5] = 30
,权当练手。
- 常函数 : 函数括号后面加了
const
,在这种函数体内不能修改成员变量
int ArrayList<T>::getLength() const{
//非法语句 长函数内不能修改成员变量
//this->size = 10;
return 0;
}
但是假如你非要修改的话呢,你就要把当前需要修改的成员变量添加修饰符mutable
,这样这个变量就能在长函数内被修改了
mutable int size = 0;
- 常对象 :这个跟常函数一样,你不能修改这个对象内的任何成员变量。你想要改的话,也需要像长函数一样,给对应的成员变量添加修饰
mutable
。
const Person p;
//非法修改
//p.age = 10;
持续更新中。。。