2018年6月

如果
2.75*a;
这种的话就算在a类里面重载了运算符*号的话也不会执行重载运算符
解决这种方案就是定义一个非成员的重载函数

Time operator*(double m,const Time & t);
这种方式的重载函数是无法更改类里面的私有函数的 可以使用友元方式来解决
friend operator*(double m,const Time & t);

重载运算符 只能选择非成员重载方式或者成员重载方式其一。

如果类的构造函数是
Stonewt::Stonewt(double lbs)
{
....
}

那么可以采用
Stonewt myCat;
myCat = 19.6;

如果要将myCat转化为double则要重定义转换函数格式是:

operator typeName();

C++类的默认访问控制权限是private
C++类中 每个实例的类的代码段是一样的,但是每个实例的数据段是不一致的。

常见的给c++成员命名前缀为:m_ 或者后缀带_ 这样可以区分参数与成员

给对象数组批量初始化可以使用以下:

Stock stocks[4]={
Stock("NanoSmart",12.5,20),
Stock("Boffo Objects",200,2.0),
Stock("Monolithic Obelisks",130,3.25),
Stock("Fleep Enterprises",60,6.5)
};

初始化对象数组的实现原理是用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。

作用域内枚举c++11
enum egg {Small,Medium,Large,Jumbo};
enum t_shirt{Small,Medium,Large,Xlarge}; //这种形式是会报错的因为两个类型里面的元素冲突
c++11提供了如下方法:
enum class egg {Small,Medium,Large,Jumbo};
enum class t_shirt{Small,Medium,Large,Xlarge};

C++的域控制器
::放在变量面前默认使用该变量的全局版本(如果重名的话)

存储说明符:

  • auto(c++11中不再是说明符)
  • register
  • static
  • extern
  • thread_local(c++11 新增的 线程变量)
  • mutable

cv-限定符
const;
volatile;
内存被初始化后就不能再次被更改 volatile 表明即使程序代码没有对内存单元进行更改,其值也可能发生变化。
有可能const会把常量的值放在寄存器 如果用volatile 的话则不会放在寄存器直接读内存可以防止编译器进行这种类型的优化

mutable 可以用它来指出const类型的结构里面的部分可更改的成员

语言链接性
C语言链接的符号跟C++不一样所以
C++要使用C语言的库函数则可以使用
extern "C" void spiff(int);

new初始化
c++ 98:
int *pi = new int(6);

c++11
int *ar = new int[4]{2,4,6,7};

名称空间及其用途:
使用在已命名的名称空间中声明的变量,而不是使用外部全局变量。
使用在已命名的名称空间中声明的变量,而不是使用静态全局变量。
c++提倡将标准函数库放在名称空间std。
using仅作为将旧代码转换为使用空间的权益之计。
不要在头文件使用using 包含头文件的顺序可能影响程序的行为。
对于using声明,首选将其作用域设置为局部而不是全局。

头文件的差异。
iostream.h 没有使用名称空间。
iostream 使用了std名称空间。

函数模板显示具体化C++98:
如:

template <> void Swap<job>(job &,job &)

匹配会优于常规的模板

显示实例化:

template <> void Swap<int>(int,int);

使用Swap模板生成void Swap(int,int) 函数定义

匹配顺序:

  • 完全匹配,但常规函数优与模板
  • 提升转换
  • 标准转化
  • 用户定义的转换

decltype关键字:
decltype 根据参数中的类型 可以用来定义相同类型的变量
如:
int x;
decltype(x) y;

后置返回类型:
auto h (int x,float y) -> decltype(x+y){}