自学内容网 自学内容网

C/C++复习(三)

一.C++基础复习

命名空间:

        对于命名空间的使用,相信大家都是非常熟悉的了,现在我们就简单回忆下即可!

首先,为什么要有它呢?原因在于如果如何变量、函数名都直接放在全局中,在大型项目中非常容易和其他人冲突,所以引入将命名空间的目的是对标识符的名称进行本地化,,可以防止命名冲突或名字污染。

顺便在复习下命名空间的三种使用方式:

1.加命名空间名称及作用域限定符,例如 std::cout

2.使用using将单个引入,例如:using::cout

3.使用using namespace 命名空间名称 引入
函数重载:

        对于函数重载,我们也是经常使用的,在这里只需要强调下重点内容即可!

        1.函数重载必须在同一作用域

        2.同名函数还需要满足形参要求(参数个数不同/参数类型顺序不同/参数个数相同型不同)

问题:如果两个函数除返回值外都相同,此时返回值不同是否为函数重载?why?

对于该问题大家肯定都知道是不构成的,但是为什么不可以构成,如果你感兴趣,可以向底层看去,这时候我们会想到为什么C语言是不支持函数重载的,原因在于底层不去做函数名修饰规则,而C++通过函数修饰规则,将重载后的同名函数区分,但是由于修饰规则中无返回值部分区分,所以如果两个函数只有返回值不同是无法区分的!

引用/指针对比:

        指针我们之前已经复习过了,现在先对引用复习下,然后进行两者对比分析。

注意点:

1.常引用要const修饰

2.引用做返回值时要特别注意,并且强烈不建议

3.引用必须初始化

面试问题:对于引用与指针请说出两者的区别和相似?

区别:

1.引用必须初始化,指针可以先不初始化(不建议)

2.引用是变量的别名,而指针则是实际上指向一个地址空间

3.引用不能改变对象,而指针可以改变指向

4.无空引用,但存在空指针

5.引用在sizeof下是指对象类型的大小,指针区别于系统,只可能是4/8字节

6.存在多级指针,但是没多级引用

7.引用自加自减是对对象操作,指针则类型偏移量自加自减一个类型单位

8.引用可以直接访问对象,指针需要解引用才能访问到对象

相似点:

在底层上引用实际上是通过指针实现的。

内联与宏:

        我们知道inline可以在编译时将函数展开,但是要注意对于inline只是对编译器的一个建议,实际上可能会不展开,为什么出现内联,此时就要回到宏上了

面试题-宏的优缺点:

优点:

1.代码复用性强

2.性能也较高

缺点:

1.不便于调试

2.代码可读性差,可维护性差,容易误用
3.无法做到类型安全检查

inline:

优点:

1.将函数展开,不影响调试,代码可读性和可维护性都还好

2.代码复用性也高

3.减少函数调用开销,提高效率

缺点:

使目标文件代码量增大,文件更大



二.类与对象

        关于这方面的知识,我之前也是详细讲过的,对于基础部分可以看我之前的博客,现在我们就直接来复习下重点部分内容

C++类的简单学习-CSDN博客

1.类大小的计算

        在(二)中我们复习了结构体的计算,类的计算大体也是如此,需要注意成员函数是不占空间的,放在了公共空间中,空类默认存在一个字节

2.this指针

        C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成,this指针类型是*const,即无法赋值,本质是成员函数的形参

3.八个默认成员函数

构造函数

        特征如下:
        1. 函数名与类名相同。
        2. 无返回值。
        3. 对象实例化时编译器自动调用对应的构造函数。
        4. 构造函数可以重载

        5.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成

注意点:默认构造函数是指无参的构造函数和全缺省的构造函数

析构函数

        特征如下:
        1. 析构函数名是在类名前加上字符 ~。
        2. 无参数无返回值类型。
        3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
        4. 对象生命周期结束时,C++编译系统系统自动调用析构函数

析构函数使用的关键点:

        如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类
默认析构函数是指不需要用户定义,由编译器自动生成的析构函数

拷贝构造函数

        特征如下:
        1. 拷贝构造函数是构造函数的一个重载形式。
        2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用

编译器生成的的默认拷贝构造函数是按照字节逐个拷贝,属于浅拷贝(值拷贝),所以如果类涉及到资源申请,需要自己写深拷贝

赋值运算符重载

        特征如下:

        1.参数类型:const T&,传递引用可以提高传参效率
        2.返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
        3.检测是否自己给自己赋值
        4.返回*this :要复合连续赋值的含义

编译器生成的默认赋值运算符重载也是逐字节的浅拷贝,如果涉及资源申请,要写成深拷贝

重载取址运算符函数/默认重载取址运算符const函数

        特征如下:

        1.参数为空,实际上只有this指针

        2.两者区别是this指针是否被const修饰,一般直接使用默认成员函数即可

移动构造函数:

移动构造函数

        特征如下:

        1.参数为右值引用&&

        2.通常利用C++11中的move进行资源利用

        3.移动构造可以将一个临时对象资源拷贝到一个新对象中,减少不必要的资源消耗,提升效率

移动赋值重载

        特征如下:

        1.参数为右值引用&&

        2.通常利用C++11中move进行资源利用

移动构造函数与移动赋值重载主要就是利用右值引用进行临时资源的再利用,默认的是浅拷贝,如果需要资源申请,需要写成深拷贝。

最后可以参考下之前我写的博客:

C++类的简单学习-CSDN博客

C++类默认成员函数(一)-CSDN博客

C++默认成员函数(二)-CSDN博客

C++默认成员函数(三)_c++ 函数方法默认权限-CSDN博客



最后,感谢大家的支持!!!


原文地址:https://blog.csdn.net/2301_79813267/article/details/142795053

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!