用户自定义的标识符不能连续出现两个下划线, 也不能以下划线紧连大写字母开头。 此外,定义在函数体外的标识符不能以下划线开头。
((试过在g++ 和 vc都可以正常使用, 这些其实是编译器自己的实现。))
引用只是别名,
引用本身不是一个对象,所以不能定义引用的引用。(int &&rr = r; //error)
引用本身不是一个对象,因此不能定义指向引用的指针。(int &*p = &r; //error)
const char* p = "abc";
std::cout << cast_cast<const void*>(p); 这样才能输出指针的值,否则默认输出指向的字符串。
默认情况下下, const对象仅在文件内有效。如果想在多个文件之间共享const对象, 必须在
变量的定义之前加extern关键字。
file1.cpp extern const int bufSize = fcn();
file1.h extern int bufSize;
指针和constexpr (p60)
在constexpr声明中如果定义了一个指针, 限定符constexpr仅对指针有效,与指针所指对象无关。
const int *p = nullptr; //p 是一个指向整形常量的指针
constexpr int *q = nullptr; //q是一个指向整数的常量指针
如果表达式的内容是解引用操作, 则decltype将得到引用类型。
decltype (*p) c; //错误, c是int&, 必须初始化。
decltype (&p) 的结果是 int**;
注意:decltype((v)) 的结果永远是引用,而decltype(v)结果只有在v本身就是
一个引用的时候才是引用。
头文件不应包含using;它可能会被拷贝到其他引用它的文件中,容易冲突。
difference_type 2个迭代器之间的距离。可正可负。
ptrdeiff_t\ size_t 定义在cstddef中。可正可负
要理解数组声明的含义,最好的办法是从数组名字开始按照由内向外的顺序阅读。(p103)
int *ip[4]; //整型指针的数组 ip是一个4个元素的数组,里面放了都是int指针
int (*ip)[4]; //指向含有4个整数的数组 (ip是一个指针)指向有4个元素的数组,元素都是int型
常量对象,以及常量对象的引用或指针都只能调用常量成员函数。
explicit, 将之能以直接初始化的形式使用。
tie有2个重载版本,1不带参数返回指向输出流的指针,2版本接受一个ostream的指针,将自己关联到此ostream。
容器中,如果元素类型没有默认构造函数, 除了大小参数外,还必须制定一个显式的元素初始值
std::array除了指定元素类型之外,还要指定容器大小。
std::array<int, 42> a;
std::array<int, 42>::size_type s;
erase 返回指向序列中的下一个元素。
insert 在给定位置之前插入新元素,然后返回指向新插入元素的迭代器。
对vector\string 等等容器插入、删除都"容易"会引起迭代器失效!!
不要保存 end();
fill_n(back_inserter(ivec), 10, 0);
lambda
[capture list] (param list) -> return type {function body}
=值捕获、&引用捕获。
ref(var); // 以引用的方式。。。
p426: 与unique_ptr不同, shared_ptr不支持直接管理动态数组,所以得自定删除器。
shared_ptr<int> sp (new int[10], [](int *p) {delete []p;});
*(sp.get() + i) = n;
拷贝构造、 拷贝赋值运算符 的使用场景不同。
CA a = b; //拷贝构造;
a = b; //拷贝赋值运算符。
赋值运算符通常应该返回一个指向其左侧运算对象的引用。
P516~P517页的算法不错。
运算符重载:
前置++ -- ()
后置++ -- (int) 多了一个int来区分, 并不使用这个int,;-)
p490:
一元运算符有一个参数, 二元运算符有2个。对于二元运算符来说,左侧运算对象传递给第一个参数,
而右侧运算符传递给第二个参数。
如果一个运算符函数是成员函数, 则它的第一个(左侧)运算对象绑定到隐式的this。
因此,成员运算符函数的(显式)参数数量比运算符的运算对象总数少一个。
class CA final : public CBase {};
p535 如果在基类中含有一个或多个虚函数, 可以使用dynamic_cast请求一个类型转换。
如果已知某个基类向派生类转换是安全的,可以使用static_cast来强制覆盖编译器的检查。
派生类向基类的自动类型转换只对指针或引用类型有效, 在2个对象之间不存在这样的转换。
函数模板和类模板成员函数的定义通常放在头文件中。
默认情况下,对于一个实例化了的类模板,其成员只有在使用时才被实例化。
原文:http://my.oschina.net/mingyuejingque/blog/484269