C ++ primer plus

C++ primer 阅读笔记
文件结束符(end of file)windows是control-Z,unix是control-d
while(std::cin>>i)
C++是静态语言,在编译时候就执行就执行类型检查。
C++的表达能力是通过支持一些允许程序员定义新数据结构的机制来提升的。
掌握C++第一步就是学习学习语言基本知识和标准库。
void没有对应的值,仅仅在有限的情况下,通常用作无返回值函数的返回类型。
8个比特是一个字节,32位或者4个字节为一个字
把一个超出范围的值赋给一个指定的对象时,先取模(可能取值数目),然后赋值。把负数赋给无符号时,在C++中合法

128LU,128u,128L,13.1f,13.2lf
宽字符是双字节多语言字符代码,L'a',L" a wide string literal"
字符串字面值的链接:两个相邻的仅由空格、制表符或者换行符分开的字符串,可连接一个一个新字符串字面值。eg:
cout<<"a multi-line "
      "string literal "
      "using concatenation"
    <<endl;
续行符\
double salary = wage = 9999.99;非法,同一定义语句中不同变量的初始化应该分别进行。

int &rval = 1; 非法,rval 是一个非const引用,非const引用不能绑定到右值。
const int &ri = 0;正确
声明是用于向程序表明变量的类型和名字。
定义是用于变量分配存储空间,还有可以位变量指定初始值,在一个程序中变量有且仅有一个定义。定
义也是声明。
头文件为相关声明提供了一个集中存放的位置:一般包含类的定义,extern变量的声明,函数的声明。如果const变量不

是用常量表达式初始化,那么他就不应该在投文件中定义。extern int total = 255应放在源文件中。
预编译是处理程序的源代码,在编译器之前运行。
设计头文件时,应该使其可以多次包含在同一文件中。
第三章
string和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是STRing类型的:
string s6 = "hello" + ","+ s2;//error
现代C++更倾向用迭代器而不是下标访问元素
第四章
数组的维数必须用值大于等于1的常量表达式:整型字面值常量、枚举常量或者用常量表达式初始化的const对象。
如果必须分开指针和其所指向的对象,则将指针初始化为0。
对指针初始化或者赋值只能使用以下四种类型:a 0值常量表达式 NULL;b 类型匹配的对象地址 c 另一对象之后的下一地址 d 同类型的另一个有效指针
指针引用的比较
1 引用总指向某个对象,定义引用没有初始化式错误的
2 赋值行为的差异:引用赋值修改的是关联的对象的值
允许把非const对象的地址赋值给const对象的指针。
不能使用void*指针保存const对象的地址,必须用const void*

type string *pstring;
const pstring cstr;
cstr 的真正类型是:声明const pstring时,const 修饰的是pstring类型,这是一个指针,因此,该声明语句应该是把

cstr定义为指向string类型对象的const指针,这个定义等价为
string *const cstr;
int *p2 = new int[10]()
圆括号表示要求编译器对数组做值初始化,在本例中级把数组元素都设置为0;
c_str 返回C风格字符串

第五章
如果两个操作数为正,除法和求模操作的结果也是正数(或0);如果两个数都是负数,除法的结果为正数是正数,而求

模的结果则为负数;如果只有一个操作数为负数,这两种操作的结果取决于机器,除法为负数。
(*p).foo
p->foo
int i(1024);
int *p = new int(1024);
值初始化的()的语法必须放在类型名后面,而不是变量后。
如果指针的值为0,则在其上做delete操作是合法,但是这样做没有意义。
一旦删除了指针所指向的对象,立即将指针置为0,这样就很清楚的表明指针不在指向任何对象。
隐式类型转换:
.混合类型表达式中,其操作数被转换为相同的类型。
.用作条件的表达式被转换为bool类型
.用一表达式初始化某个变量,或将一表达式赋给某个变量,则该表达式被转换为该变量的类型。
.整形提升:比int小的整形,将提升为int型。
.有符号与无符号类型之间的转换:
.算术转换
.指针转换:数组名是第一个元素的地址
建议避免使用强制类型转换,cast-name
旧式的强制类型转换(int),建议只有在c语言或标准C++之前的编译器上编写代码才使用这种语法

第六章
与其他大多数语句不同,块并不是以分号结束的
{}// empty block
runtime_error?
第七章
适宜引用或指针类型时,不适宜复制实参的情况:
.需要在函数中修改实参时
.大型对象作为实参传递时
.没有办法实现对象的复制

C++中,使用引用形参则更安全和更自然
利用const引用避免复制

非const引用形参只能与完全同类型的非const对象实参关联,非const引用实参在使用时不太灵活,这样的形参既不能用

const对象初始化,也不能用字面值或产生右值的表达式实参初始化

string::size_type

传递指向指针的引用 int*& V

容器的迭代器可以作为形参

形参 int* ,int[],int[10]三者等价,形参类型都可看做指向数组元素的指针。通常将数组形参定义为指针比使用数组

要好,这样就明确的表示函数操纵的是指向数组元素的指针,而不是数组本身。但是忽略了数组长度。
通过引用传递数组 void fun(int(&arr)[10]){}

多维数组形参
void fun(int (matrix*)[10],int rowsize)
void fun(int matrix[][10],int rowsize)

cstdlib定义了两个预处理变量:EXIT_SUCCESS ; EXIT_FAILURE;

不能返回局部变量的引用,不要返回指向局部对象的指针

内联函数应该放入头文件,不同于其他函数

重载函数能避免不必要的函数命名

c++ 中 ,名字查找发生在类型检查之前

第八章
缓冲区被刷新:
.程序正常结束
.在不确定的时候,缓冲区已经满了
.操纵符显示刷新缓冲区,结束符endl
.在每次输出操作执行完后,用unitbuf操纵符设置流的内部状态
.可将输出流和输入流关联起来

cout<<"hi!"<<endl<<ends(插入null)<<flush<<nounitbuf;

如果程序不正常结束,如崩溃了,输出缓冲区不会刷新

infile.open()实参需要为C风格字符串,而不是标准库string对象,比较好的方法是将文件名读入string对象,调用

c_str获取c风格字符串
out模式,任何数据都将被丢弃

第九章
顺序容器 vector(随机访问)list(快速插入删除)deque(双端队列)
顺序容器适配器stack,queue,priority_queue(优先级管理的队列)

支持复制和赋值功能是容器元素类型的最低要求

容器大小的操作
c.size() c.max_size() c.empty() c.resize(n) c.resize(n,t)
访问元素
c.back() c.front() (c[n] c.at(n)只适用vector和deque)
删除元素
c.erase(p)删除迭代器p所指向的元素,返回指向被删除元素后面的元素。
c.erase(b,e)删除b到e所标记范围内的所有元素
c.clear()删除所有元素c.popback()
c.popfront()只适用于list和deque
插入元素
insert
赋值与swap
c1= c2 c1.swap(c2) c.assign(b,e) c.assign(n,t)
capacity成员函数

string 类型的操作
string.substr(pos,n)
s.append(),s.replace()
查找操作
s.find()第一次出现
s.rfind()最后一次出现
s.find_first_of(args)查找args的任意字符的第一次出现
s.find_last_of(args)查找args的任意字符的最后一次出现
s.find-first-not-of()查找第一不属于args的字符
s.find-last-not-of
比较
compare

第十章
关联容器支持通过键值来高效的查找和读取元素
map 关联数组;元素通过键来存储和读取
set 大小可变的集合,支持通过键实现快速读取
multimap 支持同一个键多次出现的map类型
multiset 支持同一个键多次出现的set类型
pair类型
第十一章
泛型算法

第三部分:类和数据抽象
将关键字const加在成员函数的形参之后,就可以讲成员函数声明为常量:double fun() const;
const成员不能改变其所在的对象的数据成员。const必须同时出现在声明和定义中。

不在类中定义的inline函数,其定义通常放在有类定义的同一头文件中

类的定义分号结束,是因为在类定义之后可以接一个对象定义列表,故必须以分号结束

返回对象整体引用,可以调用*this

mutalbe

成员函数体用到的名字查找:
1检查成员函数局部作用域中用到的名字
2如果成员函数找不到该名字的声明,则检查对所有类成员的声明。
3如果在类中找不到声明,则检查此成员函数定义之前的作用域中出现的声明。

构造函数函数不能声明const;

可以初始化const对象或者引用类型的对象,但是不能对他们赋值,在开始执行构造函数的函数体之前,要完成初始化,

初始化const或者引用类型数据成员的唯一机会是在构造函数初始化列表中;

成员初始化的顺序就是定义成员的顺序
避免用其他成员进行初始化

只有当类没有定义构造函数式,编译器才会自动生成一个默认构造函数

如果类包含内置或复合类型的成员,则应该定义自己的构造函数

使用默认构造函数式 Item my 或者 my = Item();而不是Item my();//declare

静态成员的使用
rate = ace.rate();rate = ac2->rate();rate = Account::rate();

static成员函数
在类外定义无须重复指定static保留字;
没有this指针
不能声明为const
不能声明为虚函数

static数据成员必须在类外定义

整型const static数据成员可以再类中进行初始化,但是该数据成员必须在类的定义外进行定义

一个空的class在c++编译器处理过后就不空,
class empty{};
相当于
class empty{
public:
empty();
emppty(const empty&);
~empty();
empty &operator=(const empty& rhs);//赋值运算符
empty* operator&();//取地址运算符
const empty* operator&() const;//取const地址运算符
};

复制构造函数,赋值操作符和析构函数统称为复制控制

有些类需要完全禁止赋值,将复制构造函数声明为private

需要显式析构函数:需要是放在构造函数或者在对象生命期内获取的资源。

三法则:如果类需要析构函数,则也需要赋值操作符和赋值操作函数。

智能指针...

第十四章 重载运算符和转换
不能重载的操作符: ::   .* . ?:

调用:item1 + item2;operator+(item1,item2)
item1 += item2; item1.operator+=(item2)

定义为virtual是基类期待派生类重新定义的。基类希望派生类继承的不能定义为虚函数

如果声明一个派生类,但不实现,则声明包含类名,但不包含派生列表。
class Bulk:public Base;//error
正确的前向声明为: class Bulk;class Base;

c++默认不使用动态绑定,要触发动态绑定,必须满足两个条件:
第一:只有指定为虚函数的成员函数才能动态绑定成员函数默认为非虚函数,非虚函数不进行动态绑定,
第二:必须通过基类类型的引用或指针类型进行调用。

友元不派生

原文链接: https://www.cnblogs.com/xifengkou/archive/2012/09/01/2667051.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C ++ primer plus

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/61486

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午10:00
下一篇 2023年2月9日 上午10:00

相关推荐