c++ primer exp

标示符不能包含连续两个下划线,也不能以下划线开头后面紧跟一个大写字母。
MS一般用匈牙利命名法,Java用骆驼命名法printEmployeePaychecks(),还有下划线命名法print_employee_paychecks,C#用帕斯卡命名法PrintEmployeePaychecks()
int a=09; 是错的。
float Float = 1.0; 是对的。
int _ = 3; 是对的
cout << typeid(3.).name() << endl; 显示的结果是double。
string类型"a"长度是1。
要使const变量能够在其他文件中访问,必须显示指定其为extern,非const变量没有此要求。
const int &a = 20; 是允许的,int &a = 20; 是不允许的。const int &a = b; 无论b是否const都允许,意义是b的值不能通过a改变,a只读。
()用于单一对象的初始化,如果是数组、枚举列表等则使用{}。
enum中定义的枚举成员本身就是常量,因此不同枚举中的成员名不能相同。
保存一个string对象size的最好方式是使用string::size_type。
string的大写字母<小写字母
string使用+连接字符串时,右值中必须至少有一个string对象。
头文件cctype中有很多针对char的判断、处理函数。
char a='a'; string b; b=a; 这样可以实现char转换成string。或者用sstream,可以实现各种类型与string的转换。
::const_iterator和const的iterator区别。
#include<bitset>
const int *a = b; const修饰int,表示a指向的是const int类型对象,b可以不是const,但是不能通过a改变b值,但是指向可以改变。-->不能保证 指向const对象的指针 所指对象的值 一定不能更改。
int *const a = b; const修饰a,*的位置表示const和a是整体,表示a指向不能变。
typedef string *pstring; const pstring p = &s; 相当于 string *const p = &s。可以理解为p是const pstring的变量,p不能改变其pstring内容,即p不能改变string指针。
int *a = new int[10](); 有了括号就可以初始化a所有元素为0。
int *a = new int[0]; 这是合法的,但是a不可以被解引用。
int* a[4]; a是长度为4的数组,元素是int指针。
int (*a)[4]; a是指向长度为4的int数组的指针。
-21%-8=-5;-21/-8=2。
<stdexcept>、<exception>、bad_allco异常、bad_cast异常=try/catch,异常类通常只有string参数的构造函数和.what()成员函数。
assert(),<cassert>,对于()中的false值会提示错误。
含有可变形参的函数:(para_list, ...)
指针引用形参:int *&a;数组形参int a* = int a[] = int a[数字],三者等价,数字无意义。
若使用引用将数组传递入函数,则形参中要将数组长度声明出来,int (&a)[10]。这种要求使得传递变得安全。
若将多维数组传递入函数,可以声明动态数组,形参中定义指针,int**。否则,就要将除了第一维之外的维度显示指定(第一维照例忽略),int a[][10],int (a*)[10]。
容器:vector list deque,容器适配器stack queue priority_queue。适配器是根据原始的容器类型所提供的操作。
容器类型使用默认构造函数能达到最佳运行时性能。
容器元素的类型必须满足:支持赋值、支持复制。此外还需要有默认构造函数。
list和deque有push_front、pop_front。vector虽然没有,但是可以insert在begin前面,或者erase。
queue需要有push_front,stack和queue默认建立在deque容器,priority_queue建立在vector上。
list不能下标访问,list[n]不合法。
可以将string看做顺序容器!
priority_queue使用<比较来确定优先级,较大的将排在队列头。
迭代器失效,指的是已存储迭代器的变量会失效,重新计算.end()和.begin()即可。
pair比较大小,先比较first值,如果first一样,则比较second。
只靠前序和后续遍历结果不能确定一棵二叉树,例如前序ABC后序CBA。
BOM=Byte-Order Mark,字节序标记,长度2字节。UTF-8为可变长字节编码,汉字需要3字节,BOM可加可不加。UTF-16为固定16位编码长度,必须加BOM。UTF-32对每个字符都用4字节长度。
*it1++=*it2++; 等价于 *it1=*it2; it1++; it2++;
iterator的前++返回引用,后++返回副本。重载++/--时,为了区别前/后,规定后++/--带有一个int参数,系统会传入0值。一般重载时,前++/--均返回this引用,后++/--返回临时变量值,这是为了符合全局++/--的意义,且支持前++++/----,禁止后++++/----。
inline可以在声明或定义成员函数时添加,二选一即可。
使用向前声明,可以解决多个类之间相互包含引用的问题。class ClassName;
全局作用域操作符,::variable。
类const成员变量初始化必须在初始化列表中进行。
使用默认构造函数,ClassName obj; ClassName obj = ClassName();
explicit构造函数显示地抑制了类的隐式转换,但显示的创建临时对象依然可用。
友元类或函数,表示这些友元可以直接访问类的所有成员。
通过友元friend引入的函数或类,可以像提前声明过(向前声明)一样使用。
static成员函数/变量只在声明时使用static一次。
只有整型(int,short,long,char,long long等)const static成员变量可以在类定义体中初始化。static const int a = 0; static const char b = '#'; static const double c = 3.0;编译报错。
如果希望禁止复制构造函数使用,可以将其声明为private,如果友元和成员中的复制也禁止,可以将复制构造函数声明为private而不定义。
即使类中有显示定义的析构函数,系统自动生成的合成析构函数依然存在,且在定义的析构函数运行完成后执行,它会逆序撤销成员。合成析构函数会调用每个成员的析构函数来撤销对象。
逗号操作符从左到右进行计算,返回最右操作数的值。
通常不重载逗号、取地址、逻辑与、逻辑或操作符。
重载>>和<<必须为非成员函数,因为左操作数必须为ostream/istream类型。
template中typename和class关键字毫无区别,typename是标准C++组成部分加入C++中,旧程序可能只能使用class关键字。
模板形参可以不是类型:template <class T, size_t N> void array_init(T (&parm)[N]);  (非类型形参)
函数模板实例化时,编译器自动推断模板实参;类模板实例化则必须显示指定模板实参。
在编写模板代码时,对实参类型的要求尽可能少。
Base *b = new Derived(); typeid(b).name()显示class Base *,typeid(*b).name()显示class Derived。

转载于:https://www.cnblogs.com/RoyCNNK/archive/2013/04/03/2997584.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值