C++ primer plus 学习笔记

 .h文件为老式头文件,没有.h扩展名需要using namespace
 声明变量:需要的内存以及该单元的名称
 C++11   int  n = {1}; 初始化列表 int n {1};
 A 65  a 97
 wchar_t 扩展字符集 ,是一种整数类型,wcout处理宽字符流
 用const 比define好,可以使用C++ 作用域规则将定义限制在特定的函数或者文件中
 float a = 2.34E+22f ; float b= a+1 ;b的值等于a ,因为float只能表示数字前6位或者前7位
 C++11 列表初始化 ,不允许缩窄,不允许将浮点转换为整型. char c  {11111};not allowed
计算表达式 整型提升
 指针数组  const char * cities[Cities] = {} 
 DLL文件?
如果一个操作数无符号 另一个操作数有符号  有符号操作数转换为无符号操作数 
强制类型转换  (long)a   long(a)  后者是纯粹C++ 
int a[500] = {0} 所有元素都为0   int a[500]={1} 只有第一个元素是1
cin.getline(name,20) 不保存换行符 ;cin.get() 不读取换行符 留在输入队列中
C++11 原始字符串  R""
函数通过将返回值复制到指定的CPU寄存器或内存单元中将其返回,调用程序查看内存单元.
&array(数组名)  返回整个数组的地址  arrayint数组 长度为8  则返回32字节的内存块地址
尽可能使用const , const int *ps   ; int * const ps  不能修改指向;
int *ar2[4] 由4个指向int的指针组成的数组 ,int (*a)[4]是由一个指向由4int组成的数组的指针
const double * (*pa[3])(const double *,int) = {f,f,f};  [] 优先级高于* , *p[3] 包含三个指针的数组,
&pa是整个数组的地址,pa和&pa值相同,但是类型不同,&pa+1内存块地址,要得到第一个元素的值,**&pa
char *a="wwww"有内置的结束符
函数指针 double (*pf)(int); 函数指针调用函数  (*pf)(5);
内联函数inline  程序不用跳到另一个位置执行代码,再跳回来
按值传递  按引用传递 
右值引用 double && ref  = std::sqrt(1);
函数重载 template<typename T>
模板中,显示具体化:对于给定的函数名,可以有非模板函数,模板函数,和显示具体化模板函数以及它们的重载版本
显式具体化:template <> void swap<job>(job & , job &); 指定使用这个模板  不会寻找其他的
显式实例化 template void swap<int>(int,int);  调用生成一个模板实例
重载解析过程:第一步,创建候选函数列表,其中包含与被调用函数的名称相同的函数和模板函数;第二步,使用候选函数列表创建可行函数列表;第三步,确定是否有最佳的可行函数,如果有就使用
charint  提升转换  , charfloat  标准转换
C++11 关键字  decltype(x+y) xpy = x+y  判断变量类型
单独编译:如果编写另一个程序,也需要使用这些函数,只需要包含头文件,并将函数文件添加到项目列表或make列表中
<>在存储标头文件的主机系统的文件系统中找,“”当前工作目录
单独编译:只需要将源码文件加入到项目中,不要加入头文件,也不要使用#include包含其他文件
C++11 四种方案存储数据:自动存储持续性 静态存储持续性 线程存储持续性 动态存储持续性
链接性 外部的名称可以在文件间共享,内部名称只能由一个文件中的函数共享
局部变量:先定义的高地址,后定义的低地址。 
整数类型内部:低地址存储低位,高地址存储高位。 
类,结构体,数组:先定义的低地址,后定义的高地址。 
小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;
大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。
static 内部链接性 准
通常编译器使用三块独立的内存,一块用于静态变量,自动变量,动态存储
名称空间:声明区域 潜在作用域
命名空间:使用在已命名的的名称空间中声明的变量,而不是外部全局变量
类对象的默认访问控制为private,域解析运算符::
C++ 对重载运算符的限制 : 重载后的运算符至少有一个操作数是用户自定义的类型;不能违反运算符原来的句法规则;不能创建新运算符;有一些运算符不能重载
A a = b ; 等同于 A a  = A(b)  调用了复制构造函数 .
默认构造函数,默认析构函数,复制构造函数,赋值运算符,地址运算符.
公有派生:基类的私有部分也将成为派生类的一部分,基类的公有方法成为派生类的公有方法。 私有派生:基类的公有成员和保护成员都成为派生类的私有成员
虚基类:使得从多个类派生出的对象只继承一个基类对象,class Singer:virtual public Worker  , 信息自动传递不起作用, 虚基类使用默认构造函数。 如不使用默认构造函数,就显示调用 SingingWaiter(const Worker &wk,int p = 0 ,int v = Singer:other ) : Worker(wk),Waiter(wk,p),Singer(wk,v);
单继承,没有重新定义方法就使用最近祖先的定义, 在多继承中,用作用域解析运算符
虚二义性规则与访问规则无关 
默认类型模板参数  template < class T1 ,class T2 = int  >, 可以为类模板类型参数提供默认值,但不能为函数模板参数提供默认值
模板具体化:1隐式实例化  显式实例化  显示具体化 ,编译器在需要对象之前,不会生成类的隐式实例化 
2显式实例化 template class ArrayTP < string,100 >;
3显式具体化  template < > class Classname< specialized-type-name> {}; 以前版本这样写: class Classname< specialized-type-name>{};
模板用作参数 template< template < typename T> class Thing> ;  
C++11 template< typename T > using arrtype = std::array< T,12 > ;  arrtype< double > ball ;
注意友元函数定义声明顺序  需要前向声明
嵌套类类型受模板影响
栈解退 ,try块没有直接调用引发异常的函数,而是调用了对引发异常的函数进行调用的函数 ,程序释放栈中的内存,但不会在释放栈的第一个返回地址后停止
而是继续释放栈,直到找到一个位于try块。
noexcept 指出函数不会发生异常
RTTI 是运行时阶段类型识别 , dynamic_cast 运算符将指向基类的指针生成派生类的指针 ,typeid  返回一个指出对象类型的值,type_info 结构存储了有关特定类型的信息
dynamic_cast 向上转换 ,const_cast  改变值为const volatile ,用于执行只有一种用途的类型转换,去掉const,但仍然是不可以改变的
static_cast 向下向上都可以转换, reinterpret_cast  运算符用于天生危险的类型转换  
智能指针 auto_ptr  unique_ptr(比auto_ptr更安全)  shared_ptr(多个指针指向一个对象)
标准模板库 STL  表示容器 迭代器 函数对象 算法 
STL迭代器:输入迭代器、输出迭代器、正向迭代器、双向迭代器、随机访问迭代器
vector 数组的表示,提供了自动内存管理功能,可以动态改变vector对象的长度 在尾部添加和删除元素的时间是固定的,在头部或中间插入和删除线性时间
deque  两端插入和删除时间是固定的
list 任何位置插入和删除时间是固定的 
forward_list 单链表
queue  适配器类,不允许随机访问队列元素,不允许遍历队列 
priority_queue 也是适配器类,底层是vector 
array C++11 没有定义调整容器大小的操作,没有push_back   
函数对象 也叫函数符 ;返回bool值的一元函数是谓词 
宽字符类型 wchar_t  C++ 输出是字节流 ,ostream 将二进制位转换为由字符字节组成的输出流 
cin 检查输入,跳过空白 直到遇到空白字符  
cin.clear() 某个状态位被设置,另外两个状态位被清除  setState不会影响其他位
expections返回一个位字段,eofbit到达文件尾,badbit流被破坏,文件读取错误,failbit输入操作未能读取预期的字符或输出操作没有写入预期的字符




C++ 新标准 
新类型 long long  ,unsigned long long 
统一的初始化(初始化列表) 1防止缩窄;2 std::initializer_list
声明 1 auto2 decltype  y的类型和x相同 decltype(x) y;定义模板时很有用的
3返回类型后置  auto f2(double, int) -> double;
4模板别名 using=  可以用于模板具体化,但是typedef不能   
array(double,12) a1;
template < typename T> using arr12 = array< T,12>;
arr12< double> a1 ; //就可以这样声明了  模板具体化
5nullptr 空指针不会指向有效数据的指针  是指针类型 不能转换为整型转换 
智能指针 auto_ptr ,unique_ptr(比auto_ptr更安全)  shared_ptr  weak_ptr   
异常规范方面的修改 noexcept
作用域内枚举 enum class New1{never,sometimes,often,always}; 防止发生名称冲突
对类的修改 explicit ; 类内成员初始化 ; 
模板和STL方面的修改  
(1基于范围的for循环  
(2 新的STL容器  forward_list  unordered_map unordered_multimap
(3 新的STL方法  cend()
(4 valarray升级 ,valarray 独立于STL开发的, valarray<bool> vbool = numbers > 9 ; vbool[i]被设置成numbers[i] > 9 
slice 起始索引 索引数 跨距 ,如果valarray< int>对象varint,varint[slice(1,4,3)] = 10 ,第1 4 7 10 元素都设置成10
(5摒弃export 
(6尖括号 vector< list< int> > vl;
右值引用关联到右值,可以出现在赋值表达式右边,但不能对其应用地址运算符的值,右值包括字面常量 x+y等表达式以及返回值的函数
int x = 10 ; int && r1 = 13 ; int &&r2 = x + y ; r2关联一个数值,将右值关联到右值引用导致该右值被存储到特定的位置 ,且可以获取该位置的地址
虽然不能将&用于13,但是可以用于r1.

移动语义和右值引用 
移动语义实际上避免了移动原始数据,只是修改了记录 
移动构造函数解析:让移动语义发生,需要两个步骤,右值引用让编译器知道何时可使用移动语义
Useless two = one ;
Useless four(one + three)
移动语义消除额外工作 

C++11 新的类功能:原有默认构造函数 复制构造函数 复制赋值运算 析构函数
新增 移动构造函数 移动赋值运算 
默认的方法和禁用的方法 default, 提供了移动构造函数就没有自动创建默认的构造函数
关键字delete和将复制函数放在private中效果差不多
delete 可以用于禁止特定的转换  void redo(int) = delete ; 

委托构造函数 继承构造函数 

管理虚方法:  override final(禁止派生类重新定义函数)

Lambda函数
[&count](int x){count += (x % 13 == 0);}
三种方法给STL算法传递信息: 函数指针 函数符 lambda   ,使用匿名函数---无需给函数命名
[](double x)->double{int  y = x ; return x - y} 当lambda表达式一条返回语句时可以自动类型推断,但是多个语句不行
auto mod = [](int x) {return x % 3 == 0; };
int count13 ; 
for_each(numbers.begin(),numbers.end(),[&count13](int x){count13 += x % 13 == 0})按引用捕获


用模板调用不同函数 
template < typename T,typename F>
T use_f(T v,F f)
{
    //******body
    return f(v) ;
}
包装器function 重写上述程序 只使用use_f()的一个实例而不是5个  根据特征标
function< double(double)> ef1 = dub ; 
function< double(double)> ef2 = [](double u){return u*u} ; 


可变参数模板
{
    模板参数包 类型列表 char int const char*
    函数参数包 
    展开参数包
    递归
}


template < typename...Args>
void show_list1(Args_args)
{
    ...
}

Args 是模板参数包 args是函数参数包 
template< typename T,typename... Args>
void show_list(const T &value, const Args&... args)
{
    show_list(args);
}


C++11 新增的其他功能
并行编程
新增库 random 
chrono 时间间隔
typle 广义pair
radio 有理数
regex 正则表达式库
低级编程  抽象程度低
加强元编程
POD规则
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值