C++学习笔记

1、数组本身所含数据量可能很大   但是引用所占内存很小   所以传引用可以节省内存,避免不必要的资源浪费

2、即使是返回类型定义为void 的函数  依然可以调用 return; 去提前退出一个函数    注意return 与 分号; 间  无字符

3、main函数不能被重载。假设有两个函数,形参列表一样但是返回类型不同,则第二个函数的声明是错误的。

4、尾置返回类型  

auto func(int i)->int (*)[10];  //返回一个指针,该指针指向含有10个整数的数组
因为我们把函数的返回类型放在了形参列表之后,所以可以清楚地看到func函数返回的是一个指针,并且该指针指向了含有10个证书的数组

5、允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化

constexpr int mf=20;      //20是常量表达式
constexpr int limit=mf+1; //mf+1是常量表达式
constexpr int sz=size();  //只有当size是一个constexpr函数时才是一条正确的声明语句
constexpr int *q=nullptr; //q是一个指向整数的常量指针 在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效 与指针所指对象无关
6、重载时  一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来
void fun(int* m)									
{                           
	cout << "fun(int* m)" << endl;           
}

void fun(int* const m)
{
	cout << "fun(const int* m)" << endl;
}

这两个函数是不能同时存在的

7、一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值

8、重载函数匹配时,所有算数类型转换的级别都一样    例如:

void manip(long);
void manip(float);
manip(3.14);          //错误,二义性调用.

9、要想声明一个可以指向该函数的指针,只需要用指针替换函数名即可

bool (*pf)(const string&,const string&);     //   *pf 两端的括号必不可少 否则pf是一个返回值为bool指针的函数
bool b1=pf("hello","goodbye");
bool b2=(*pf)("hello","goodbye");          //等价调用  无须提前解引用指针
10、一个constexpr函数被隐式声明为内联函数。

11、一个可变数据成员(mutable)永远不会是const,一个const成员函数可以改变一个可变成员的值。

12、如果一个构造函数为所有参数都提供了默认是惨,则它实际上也定义了默认构造函数。

13、使用unique,unique_copy前一定要记得排序  sort

14、算法形参模式

alg(beg, end, other args);
alg(beg, end, dest, other args);
alg(beg, end, beg2, other args);
alg(beg, end, beg2, end2, other args);
其中 alg 是算法的名字,beg 和 end 表示算法所操作的输入范围。几乎所有算法都接受一个输入范围,是否有其他参数依赖于要执行的操作。这里列出了常见的一种——dest、beg2和end2 ,都是迭代器参数。顾名思义,如果用到了这些迭代器参数,他们分别承担指定目的位置和第二个范围的角色。除了这些迭代器参数,一些算法还接受额外的、飞迭代器的特定参数。——《C++primer 5th》

15、对于list和forward_list,应该优先使用成员函数版本的算法而不是通用算法。 ——《C++primer 5th》

16、基类中的protected 成员,基类的派生类有权访问,其他用户不能访问。

17、override 可以防止错写函数未重载基类中的虚函数

18、使用重载的运算符本质上是一次函数调用,所以这些关于运算符对象求值顺序的规则无法应用到重载的运算符上。特别是,逻辑与运算符、逻辑或运算符和逗号运算符的运算对象求值顺序规则无法保留下来。除此之外,&& 和 || 运算符的重载版本也无法保留内置运算符的短路求值属性,两个运算对象总是会被求值。   —— 《C++ primer 5th》

19、我们不能(直接)将重载函数的名字存入function类型的对象中(可存储函数指针或使用lambda来消除二义性)

20、当我们使用重载运算符作用于类类型的运算对象时,候选函数中包含该运算符的普通非成员版本和内置版本。除此之外,如果左侧运算对象是类类型,则定义在该类中的运算符的重载版本也包含在候选函数内。因为当我们在表达式中使用重载的运算符时,无法判断正在使用的是成员函数还是非成员函数。 当我们调用一个命名的函数时,具有该名字的成员函数和非成员函数不会彼此重载,这是因为我们用来调用命名函数的语法形式对于成员函数和非成员函数来说是不相同的。

21、重载的运算符必须至少含有一个类类型的运算对象。重载运算符的优先级、结合律、运算对象数量都与其内置版本一致。

22、一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数。

23、如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致。

24、可在类内使用 using 声明语句将该类的直接或间接基类中的任何可访问成员标记出来,改变个别成员的可访问性。using 声明语句中名字访问权限由该 using 声明语句之前的访问说明符决定。但不会改变构造函数的访问级别。

25、除了覆盖继承而来的虚函数之外,派生类最好不要重用其他定义在基类中的名字。如果派生类(即内层作用域)的成员与基类(即外层作用域)的某个成员同名,则派生类将在其作用域内隐藏该基类成员。即使派生类成员和基类成员的形参列表不一致,基类成员也仍然会被隐藏掉。

26、将实参传递给带模板类型的函数形参时,能够自动应用的类型转换只有const 转换及数组或函数到指针的转换。如果形参是一个引用,数组不会转换为指针。算数转换、派生类向基类的转换以及用户自定义的转换,都不能应用于函数模板。

 



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值