首页 > 编程语言 > 详细

c++ primer 5

时间:2015-07-27 16:55:18      阅读:169      评论:0      收藏:0      [点我收藏+]


用户自定义的标识符不能连续出现两个下划线, 也不能以下划线紧连大写字母开头。 此外,定义在函数体外的标识符不能以下划线开头。

((试过在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个对象之间不存在这样的转换。


函数模板和类模板成员函数的定义通常放在头文件中。

默认情况下,对于一个实例化了的类模板,其成员只有在使用时才被实例化。


c++ primer 5

原文:http://my.oschina.net/mingyuejingque/blog/484269

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!