【C++初阶】1.类和对象 两万字深度拆解,手把手带你入门C++
2026/5/4 9:25:27 网站建设 项目流程
前言

众所周知,C加加难学,这主要是因为其陡峭的学习曲线。本篇是C加加的第一篇,讲解C加加的第一个知识点:类和对象。而这个知识点难度就是比较大的。我们将尽量使用好懂的语言以及逻辑衔接去讲解它

一、引用
理解

给对象取别名

特征

必须初始化

例如:int& a;这样的写法是错误的,引用必须在定义时初始化。

可以给别名取别名

代码语言:javascript

AI代码解释

int a = 1; int& ra = a; int& rra = ra;

一旦引用,不可引用其它的实体

代码语言:javascript

AI代码解释

int a = 20; int b = 10; int& ra = a; ra = b;

可能有同学认为引用本质是指针,就以为引用对象可以改。

但如上代码不是改ra引用对象为b,而是给本尊重新赋值。

由此,引用可以看作取小名,一个人可以有多个小名、外号,但人始终只有一个。

引用作用(在这里仅供了解,以后会深入)
  • 传参,做返回值
  • 传引用返回,传值返回

代码语言:javascript

AI代码解释

void func1(int& x); // 传引用 int& func2(int x); // 返回引用

x较大可以提升效率。

此外,有意思的是,引用做返回值可以直接修改本尊:

代码语言:javascript

AI代码解释

int arr[20]; int& func() { return arr[2]; } int main() { func() = 3; // 直接修改数组 cout << arr[2]; // 输出3 return 0; }

如图,直接修改数组

因此,就能引出一个问题:引用返回这么好用,以后全用引用返回不就好了?

显然,答案是否定的。

将上面的代码arr定义成局部再来看看:

代码语言:javascript

AI代码解释

int& func() { int arr[20]; // 局部数组 return arr[2]; // 返回局部变量的引用 } int main() { int a = func(); cout << a; // 打印出了随机值 return 0; }

由于函数栈帧在结束后会被销毁,因此也变成了随机值。

const引用

既然我们研究了变量a的引用,那就更进一步去研究常数的引用吧:

代码语言:javascript

AI代码解释

int main() { int& rc = 10; // 报错 return 0; }

报错了,这就关系到权限的问题了。

10为常数,引用只能用常数(const)引用

代码语言:javascript

AI代码解释

const int& rc = 10; // 正确

权限只可缩小,不可放大

代码语言:javascript

AI代码解释

int a = 10; const int& ra = a; // 权限缩小 ra++; // 会报错 int& rra = a; // 权限一致 rra++; // 则不会

同时,对表达式(a+b)的引用呢?

代码语言:javascript

AI代码解释

int a = 1; int b = 2; int& r = (a + b); // 神奇的报错又来了

接着报错

我们回顾一下临时对象,由于表达式会创造出一个临时对象,而临时对象有常性,因此必须加const

代码语言:javascript

AI代码解释

int a = 1; int b = 2; const int& r = (a + b); // 这下就能过了

同时,更进一步,隐式类型转换也是有常性的,也要加const

代码语言:javascript

AI代码解释

double a = 3.14; const int& ra = a; // 正确

但是注意,再转一次还是要加const的:

代码语言:javascript

AI代码解释

double a = 3.14; const int& ra = a; const double& rra = ra; // double& rra = ra; 是错的

因此,const引用可以让传参更加广泛。

引用与指针的区别

首先,两者本质都是指针。在编译下,两者语句一模一样。

区别:

引用不开空间,指针开空间

指针可以空,引用不能

代码语言:javascript

AI代码解释

int* p = NULL; int& rp = *p; // 这样的代码会崩溃 rp++;

因此,有"野指针",但很少有"野引用"

sizeof语句返回值不同

代码语言:javascript

AI代码解释

int a = 1; int* pa = &a; int& ra = a; cout << sizeof(pa) << endl; // 在64位下为8 cout << sizeof(ra) << endl; // 输出4(int的大小)

引用对象不可变,参考上文

引用可以直接访问,指针要解引用

二、Inline 内联

在开始讲之前,先回顾一下C的宏:

代码语言:javascript

AI代码解释

#define ADD(a, b) ((a) + (b))

有没有最后的分号?外大括号?内大括号?为什么这样?

在C++中,内联可以代替宏:

代码语言:javascript

AI代码解释

inline int Add(int a, int b) ​​​​​​​{ return a + b; }

作用与宏类似,在使用时展开,让效率更高,但实则智能得多。

特征
  1. debug默认不展开这也意味着可以对其进行调试。
  2. 是否展开取决于编译器做个计算:
    • 一个100行的语句被调用10000次
    • 全部展开,会是100 * 10000条
    • 不展开,会是100 + 10000条

    全部展开会让程序臃肿。

  3. 注意声明定义要放在一个文件中,否则会报错
三、nullptr (C++11)

简单说,就是C++版本的空指针。

但,C语言就有NULL了,为什么要新弄一个新的关键字nullptr呢?

NULL的本质:一个定义为0的宏

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询