一、 转换函数 conversion function
1) 转换函数没有返回类型,函数名称就是转换后的类型
2) 通常都会加上const;
double d=4+f 编译过程是否是先找操作符重载,不满足再找类型转换(待确定)
转换(faction -> double)
3) 转换函数不一定是基本类型
二、no-explicit-one-argument/explicit-one-argument ctor
1) 显式构造函数:
按照默认规定, 只有一个参数的构造函数也定义了一个隐式转换,
explicit关键字只对有一个参数的类构造函数有效, (其他参数没有默认值, 如果有默认值也按照一个参数处理)
关于 explicit 下面链接的作者说得比较清楚
http://www.cnblogs.com/ymy124/p/3632634.html
参考他的博文写了一个例子
#ifndef __CXSTRING__
#define __CXSTRING__
#include <iostream>
using namespace std;
class CxString
{
public:
explicit CxString (int age) { cout << "ctor 1" << endl; }
CxString (const char *p) { cout << "ctor 2" <<endl;|
}
#include#include "cxstring.h"
using namespace std;
int main() {
CxString string1(24);
CxString string2 = 10;
//CxString string3;
CxString string4("abc");
CxString string5 = "def";
//string3 = string1;
return 0;
}
新增 explicit 后 编译报错
week4test.cpp:9:21: error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
CxString string2 = 10;
^
目前看如果对 有 CxString (int age) 未 增加 explicit 编译器 对 10 进行了 CxString(10)的转换, 而增加explicit后编译器使用另外一个只有一个参数的构造函数函数 CxString (const char *p) 对 10 进行转换, 这个时候由于参数类型不同编译报错
应证了“按照默认规定, 只有一个参数的构造函数也定义了一个隐式转换,”
三、 pointer like class
关于智能指针, share-pointer ->操作符可以复用
关于迭代器: 操作符重载
四、 function like class
对操作符号() 的重载
五、 namespace
划分作用域
六、类模板
类模板需要写明类型
七、 函数模板
函数模板使用式编译器再进行确定, 不需要写明类型
八、成员模板
模板中包含模板
九、模板特化
十、模板偏特化
1)个数
2)范围 类型变为指针
十一、模板模板参数
1)将一个模板做为另外一个模板的参数
十二、关于C++标准库
1)容器:
2)迭代器;
3)仿函数;
4)算法;
十三 、 variadic templates
数量不定的模板参数
template <typename...Types >
function (const Types& ... args)
sizeof...(args) 参数个数
十四 、 auto
编译器自动推导类型, 只有再定义并初始化赋值时有效
十五、 ranged-base for
for (decl: coll) {
statement
}
十六、 reference
reference一般用于参数传递和函数返回;
函数签名(函数名+参数部分) const也属于签名一部分
十七、 object model
1) 继承和构造和析构 构造先父类后子类, 析构先子类后父类
2) 组合的构造和析构 container调用component 构造, 再构造自己, container先自己析构, 再析构component
3) 继承+组合 base -> component ->子类 析构 子类->component -> base
网友评论