C++进阶(十一) : C++的冷知识小结

1、定义在类声明中的函数自动成为内联函数,所以默认构造及默认析构函数都是内联函数。

2、对象数组初始化的底层实现为:首先使用对象默认构造函数创建数组元素,然后使用等号右边花括号中值构造临时对象,最后将临时对象复制到相应的数组元素内。因此如果要创建类对象数组,则这个类必须有默认构造函数。

3、C++11提供了一个新枚举,其枚举量的作用域为类,具有更强的约束力。

enum class :short egg{Small,Media,Large};

4、可将派生类对象赋值给基类或者使用派生类对象初始化基类对象,但内容只涉及基类部分。

#include<iostream> 
using namespace std;
// 父类 
class Fruit {
public:
	Fruit(){

	}
	Fruit(Fruit& f) {
		cout<<"构造 Fruit"<<endl;
	}
	Fruit operator=(const Fruit& b) {
		cout<<"运算符 Fruit"<<endl;
	}
};

// 子类
class Banana :public Fruit{
};
 
int main() {
    Banana banana;    // 构造父类对象
	Fruit fruit;      // 构造子类对象
	fruit = banana;   // 将子类对象赋值给父类对象
	Fruit fruit1 = banana; // 使用子类对象,构造父类对象
	return 0;
}
// 打印为:运算符 Fruit
//        构造 Fruit

5、任何小于int类型的两个正数相加,在相加之前都会将其提升为int类型后,再进行操作----整型提升

6、C++只允许一层指针的const自动类型转换

7、new失败不会返回空指针,只会抛出异常,唯一可以使其返回空指针的方法是在new后面加上(std::nothrow),例如:

int* p = new (std::nothrow) int;

8、noexcept只是告诉编译器这个函数不会抛出异常,对其不做异常方面的处理,从而提升效率,但是实际是否抛出异常,由开发者自己决定,如果声明了noexcept,结果却抛出了异常,编译器将对其不做处理,程序将直接退出

9、const类型的引用变量只能在类的初始化列表内进行初始化

10、static成员变量只能在类外进行初始化,而static const的类型的成员变量则可以在类内进行初始化

11、不可以对成员函数同时使用static及const(前缀修饰)进行修饰,因为C++编译器在实现const函数时,为了确保该函数不会修改对象的成员,会传入一个隐式的参数:const this *,但static函数是没有this指针的,也就是说static与const是冲突的。

12、C++中*与&同时修饰形参时表示指针的引用,例如:

/*
此时head为int类型指针,在函数insert内,head指针只是实惨的一份拷贝,所以修改head的内容,对实惨并没有影响,所以此时我们在该函数内只能提供*head方式修改其所指向的内容,而无法修改其指向,但是此时使用&修饰后,head则表示为int类型指针的引用,所以此时我们可以修改head的指向,也可以修改其所指向的内容。
*/
int insert(int* head)

/*
此时head为int类型指针的引用,所以此时我们不仅可以修改其所指向的内容,也可以修改head的指向。
*/
int insert(int *& head)

13、哪些函数不能成为虚函数:(1)全局普通函数 (2)友元函数 (3)构造函数 (4)内联成员函数 (5)静态成员函数

14、不可以在一个类内同时声明两个同名同参的虚成员函数及静态成员函数,因为编译器傻傻分不清楚

15、虚函数不可以是内联的,因为内联函数是在编译时决定的,但是虚函数时运行时决定的,即使强行在虚函数前加上inline关键字,但仍然会被忽略

16、函数加上const修饰和不加const修饰,其实是两个函数,所以在父类中某虚函数加上const,但是同名同参的子类成员函数没有加上const,不会被重写

17、不能将一个数组直接赋值给另一个数组,字符串数组也不行,但可以将一个结构直接赋值给另一个结构

18、数组可以使用大括号形式进行初始化且可以省略等号,但这个只能在初始化时候使用,如下表达式,表示的是将第1个和第2个元素分别初始化为11和22,其余元素使用默认值,即为0 :

int[12]{11,22};

19、字符串的前缀u、U、L、R分别代表char16_t、char32_t、wchar_t以及原始字符串

20、对一个空指针进行delete或free操作将什么也不做

21、数组名是指针常量,是数组首元素的地址,对数组名取地址就是整个数组

22、前缀自加加(++i)比后缀自加加(i++)效率要高,因为前缀直接返回其值加1的结果,而后缀则会先复制一个副本,然后让副本加1,再返回副本,显然效率更低

23、如果函数使用const引用作为形参,而调用函数时,传入的是常量或与形参const引用类型不匹配,C++将创建临时匿名变量存储该值

24、函数使用引用作为形参时,尽量使用const修饰,好处如下:(1)可以避免无意中修改数据的编译错误(2)使用const引用可以使函数接受const和非const实参,否则只能接受非const (3)使用const引用使函数可以正确生成并使用临时变量

25、类型引用和类型本身视为同一特征标。const是否可以作为函数重载特征标视情况而定   https://www.cnblogs.com/qingergege/p/7609533.html

26、函数模板:

  • 显示具体化:template<>void Swap<Job>(Job& j1,Job& j2);
  • 显示实例化:template void  Swap<Job>(Job& j1,Job& j2); 

注意:显示实例化不包含 <>,可以通过函数使用创建显示实例化:Swap<Job>(j1,j2);

27、函数重载的调用顺序:(1)创建候选函数列表,即函数名称相同的所有函数,包括函数模板 (2)筛选出参数个数匹配的函数,包括默认参数(3)匹配最佳:完全匹配,a、常规函数优于模板 b、提升转换,即int->long  c、用户自定义转换

28、成员函数的右边放一个&代表左值引用函数,说明这个接口只能被左值调用,但是不能被右值使用。成员函数的右边放&&代表右值引用函数,说明这个接口只能被右值调用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值