C++必备常识

1、指针和引用的区别

1.引用是给变量起别名,内部实现是指针常量(int *const ret = &a)可以简单的理解成,本体指针存放的是变量的地址。

2.引用的本质是指针常量,其指向不了修改,而指针可以改变指向。

3.引用创建的同时,必须初始化,指针创建的时候可以不用初始化。

4.引用不能为NULL,指针可以为NULL。

5.“引用变量ret”的内存单元保存的是“被引用变量a”的地址,sizeof(引用)=指向变量的大小,sizeof(指针)=指针本身的大小。

6.引用使用的时候无需解引用,指针需要解引用。

7.指针和引用“自增、自减”运算意义不一样。

2、对内联函数的理解

宏函数的缺陷:
1、需要加()来保证优先级的完整性
2、即使加了()有些情况依然有缺陷

(1)、内联函数有inline关键字修饰,否则为普通函数
(2)、如果有声明,函数本身和声明都要加上inline
(3)、内联函数本身是一个函数,但宏函数不是函数
(4)、内联函数具有普通函数的所有行为唯一不同之处在于: 内联函数会在适当的地方像定义宏一样展开,可以以空间换时间因此,内联函数既可以避免宏函数的缺陷,也可以避免普通函数入栈的时间浪费
(5)、任何在“类”内部定义的函数会自动成为内联函数。
(6)、下列情况,普通函数即使指定为内联函数,编译器也可能考虑不按内联编译1)存在任何形式的循环语句2)存在过多的条件判断语句3)函数体过于庞大4)对函数进行取址操作
(7)、使用方式建议: 1)内联仅仅只是给编译器一个建议,编译器不一定会接受这种建议2)如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译(-个好的编译器将会内联小的、简单的函数)因此,不用刻意使用内联函数,可以交给编译器去自行处理

3、函数重载的条件

函数重载:
在C语言中,函数名必须是唯一的, 程序中不允许出现同名的函数//在C++中是允许出现同名的函数,即在同一作用域内,具有相同函数名,不同参数列表的-组函数,称为函数重载

函数重载实现的原理
编译器为了实现函数重载,也是默认为我们做了-些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如void func();编译器可能会将函数名修饰成func,当编译器碰到void func(int x),编译器可能将函数名修饰为func int, 当编译器碰到void func(int x,char c),编译器可能会将函数名修饰为_func int_ char我这里使用”可能这个字眼是因为编译器如何修饰重载的函数名称并没有一个统一的标准,所以不同的编译器可能会产生不同的内部名

函数重载的条件
同一个作用域、参数的个数不同、参数类型不同、参数的顺序不同

4、C++的封装性

封装特性包含两个方面,一个是属性和变量合成一个整体,一个是给属性和函数增加访问权限

5、构造函数的调用规则

默认情况下,C++编译器至少为我们写的类,增加了三个函数:
1、默认构造函数(无参,函数体为空)
2、默认析构函数(无参,函数体为空)
3、默认拷贝构造函数,对类中非静态成员属性简单值拷贝
如果用户定义了拷贝构造函数,C++不会提供任何默认构造函数。
如果用户定义了普通构造(非拷贝),C++不会提供默认无参构造,但会提供默认拷贝构造函数。

6、浅拷贝与深拷贝的区别

浅拷贝:
同一类型的对象之间可以幅值,使得两个对象的成员变量的值相同,两个对象任然是独立的两个对象,这种情况被称为浅拷贝。
一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。

深拷贝:
当类中有指针,并且此指针有动态分配空间,析构函数做了释放处理,往往需要自定义拷贝构造函数,自行给指针动态分配空间。

7、对象成员以及对象成员的构造函数调用方式

在类中定义的数据成员,一般都是基本的数据类型。但类中的成员也可以是对象,叫做对象成员。

如果子类的成员属性是私有的,要完成初始化,可以使用构造函数初始化列表。

当调用构造函数时,首先按各对象成员在类定义中的顺序(与参数列表的顺序无关),依次调用他们的构造函数,对这些对象初始化,最后再调用本身的函数体,也就是说,先调用对象成员的构造函数,再调用本身的构造函数。析构函数和构造函数的调用顺序相反,先构造,后析构。

8、C中的malloc free和C++中的new delete的区别

1、new和delete是C++关键字,需要编译器支持;malloc和free是库函数,需要头文件支持。

2、使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。

3、new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

4、C++允许重载new/delete操作符,malloc不允许重载。

5、new做两件事:分配内存和调用类的构造函数,delete是:调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。

6、new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。

9、static 静态成员变量

在一个类中,若将一个成员变量声明为 static,这种成员称为静态成员变量。与一 般的数据成员不同,无论建立了多少个对象,都只有一个静态数据的拷贝。静态成 员变量,属于某个类,所有对象共享。 静态变量,是在编译阶段就分配空间,对 象还没有创建时,就已经分配空间。
静态成员变量必须在类中声明,在类外定义。 静态数据成员不属于某个对象,在 为对象分配空间中不包括静态成员所占空间。 静态数据成员可以通过类名或者对 象名来引用。

10、static静态成员函数

在类定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数使用方式和静态变量一样,同样在对象没有创建前,即可通过类名调用。静态成员函数主要为了访问静态变量,但是,不能访问普通成员变量。

静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。

1、静态成员函数只能访问静态变量,不能访问普通成员变量
2、静态成员函数的使用和静态成员变量一样
3、静态成员函数也有访问权限
4、普通成员函数可访问静态成员变量、也可以访问非经常成员变量

11、this指针

1、this指针是隐含在对象成员函数内的一种指针
2、成员函数通过this指针,就能知道操作的是哪一个对象的数据
3、静态成员函数 内部没有this指针,静态成员函数不能操作非静态成员变量(静态成员函数 是属于类,函数内部没有this 指针)

12、友元

类的主要特点之-是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问。但是,有时候需要在类的外部访问类的私有成员,怎么办?解决方法是使用友元函数,友元函数是一种特权函数,C++允许这个特权函数访问私有成员

1、friend关 键字只出现在声明处
2、其他类、类成员函数、全局函数都可声明为友元
3、友元函数不是类的成员,不带this指针
4、友元函数可访问对象任意成员属性,包括私有属性

友元的注意事项

1、友元关系不能被继承。
2、友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。
3、友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友。

13、纯虚析构与非纯虚析构的区别

纯虚析构函数在c++中是合法的,但是在使用的时候有一个额外的限制:必须为纯虚析构函数提供一个函数体。

纯虚析构函数和非纯析构函数之间唯一的不同之 处在于纯虚析构函数使得基类是抽象类,不能创建基类的对象。

注意:如果类的目的不是为了实现多态,作为基类来使用,就不要声明虚析构函数,反之,则应该为类声明虚析构函数

14、重写,重载,重定义

1、重载,同一作用域的同名函数a、同一个作用域b、参数个数,参数顺序,参数类型不同C、和函数返回值,没有关系d、const也可以作为重载条件//do(const Teacher& t){} do(Teacher& t)
2、重定义(隐藏) a、有继承b、子类(派生类)重新定义父类(基类)的同名成员(非virtual函数)
3、 重写(覆盖) a、 有继承b、子类(派生类)重写父类(基类) 的virtual函数 C、函数返回值,函数名字,函数参数,必须和基类中的虚函数- -致

15、函数模板

c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函 数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数 就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函 数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板 中的虚拟类型,从而实现不同函数的功能。 c++提供两种模板机制:函数模板和类 模板 类属 - 类型参数化,又称参数模板 总结: 模板把函数或类要处理的数据类型参数化,表现为参数的多态性,成为类属。 模板用于表达逻辑结构相同,但具体 数据元素类型不同的数据对象的通用行为。用模板是为了实现泛型,可以减轻编程的工作量,增强函数的重用性。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值