我的c++积累一部分

map只允许一个键对应一个值,而multimap是可以一个键对应多个值的。
所以要得到multimap的全部的值,需要count得到个数,然后find找到相应的位置。
set也只允许一个键对应一个值,而multiset是可以一个键对应多个值的。
用作模板形参的名字不能再模板内重用。
同一模板的声明和定义中,模板的形参的名字不必相同。
减少处理头文件的编译时间,有些c++的实现支持预编译头文件。
因为头文件包含在多个源文件中,所以头文件中不应有变量和函数的定义。
头文件中可以定义类,预先知道的const变量和inline的函数。
string.size();返回的对象不要用int来接受,最好用string::size_type类型来接收。
c++删除0值得指针式可以的:int* p = 0; delete p;是可以的。
多重继承是在中间用逗号隔开的
continue只能存在for,while,do while循环块中。对于while和do while直接进行下一个语句,而对于for直接进入expression语句。
函数指定默认实参既可以在函数声明也可以在函数定义中指定默认实参。但是在一个文件,只能为一个形参指定默认实参一次。通常只适合在函数的声明中指定默认实参。
函数模板的特化是template<> 函数名+模板形参
如果一个模板和一个普通函数名是一样的,而且普通函数的参数也是和模板参数对应起来,那么这时候将不会把普通函数看成是模板函数的特化,而是一个重载
为了防止复制,可以将类的复制构造函数声明为private的。
在模板里面,如果是某个域里的类型,需要在前面加上typename进行标识。
非类型模板形参,传入数组为什么要用引用,是因为传入数组引用能够保存数组的大小,而不会退化成指针。
类模板是不支持分离编译的,类模板的定义和声明应该写在头文件中,其他编译单元包含的时候也需要把定义和声明同时包含进来,不同编译单元中的匿名名字空间不属于一个名字空间,虽然他们都是匿名的。
类模板成员函数的模板,如果定义在类模板外,那么需要将类模板的模板参数表和自身的模板参数列表放在前面。例如:template<typename elemType>template<typename T>void List<elemType>::getVoid(T a){}
除整形以外,其他的不要用来作为非类型模板形参
函数不能进行偏特化,类有全特化和偏特化
throw抛出指针是坏主意,抛出指针要求存在在指针所指向的对象。
如果catch(...)与其它catch子句结合使用,它必须是最后一个,否则,任何跟在它后面的catch子句都将不能被匹配。
未命名的命名空间相当于static修饰的全局变量或者函数,都是局限于本文件可见。
局部类的所有成员必须完全定义在类定义体内部,因此局部类远不如嵌套类有用。
局部类访问外围作用域中的数据是有限的,只能访问外部作用域的类型名,static变量和枚举变量。
局部类中private成员几乎是不必要的,通常局部类的所有成员都为public成员。
嵌套的局部类可以在外部类外面定义,不过要加上外部类的作用域,并且和外部类是一个作用域。
嵌套类和外部类基本上是独立的,与外部类不相关。
嵌套类定义其外部类的一个成员,不同访问权限就有不同的类型。
嵌套在类模板内部的类是类的模板。
union是一个节省空间的类,但是在任何时候只有一个成员有值。
union也可以定义成员函数,包括构造函数,析构函数,但是它不能作为基类,所以成员函数也不能为虚数。
union不能具有静态数据成员或引用成员,union不能具有定义了构造函数,析构函数或者赋值操作符的类类型的成员。
union只能为第一个成员初始化。
union可以作为类的成员变量,很多使用联合体都是在类中使用,都是选择匿名联合体,类的匿名联合体可以直接访问,类::成员,匿名联合体不能为private和protected两种类型。
不存在抛出数组和函数的异常,抛出数组的话,意思是抛出了数组的首地址,函数同样是抛出函数的指针。
执行throw的时候,不会执行跟在throw后面的语句,而是将控制从throw转移到相应的catch中。
析构函数一般是不会抛出异常的。如果为某个异常进行栈展开的时候,析构函数又抛出一个自己未经处理的另一个异常的话,将会导致调用标准库terminate函数,一般terminate调用abort函数,强制函数退出。
如果抛出的异常没有得到处理,那么就会导致程序崩溃。
clang是一个轻量级的编译器,也就是一个解析器。
只有在强调速度的时候才能使用数组和指针。
非const变量和以及要到运行阶段才知道它的值的const变量都不能作为数组的维度。
getline函数返回时会丢弃换行符。
任何改变vector长度的操作都会使迭代器失效。
非const变量是默认extern,而const变量是限本文件的,要能够在其它的文件访问,那么就得显式的声明为extern的。
不能使用void*来保存const对象指针,只能用const void *来保存。
c风格字符串都是以null结尾的字符串。
逻辑与和逻辑或都是遵循短路求值。
在类内部定义的函数默认为inline
类的前向声明可以作为指针,引用,形参和返回类型。
this指针通常是不必要的,除非在需要返回对象整体的时候。
const成员函数只能返回*this作为一个const引用。
const成员函数可以改变mutable修饰的成员变量。
构造函数的初始化列表和函数体内都可以进行初始化,但是区别在于一个在初始化阶段,一个在普通的计算阶段。
构造函数的初始化顺序是按照成员定义的顺序来初始化的。
类的static成员函数可以直接访问static成员变量,但是不能访问非static的成员变量。
static成员函数没有this指针,因为static成员函数不是任何对象的组成部分,所以static成员函数不能声明为const,毕竟成员函数声明为const就是不能修改函数所属的对象。同时它也不能声明为虚函数。
声明为虚函数表示基类指针或者引用可以访问派生类的同名函数,但是虚函数还是必须有实现,除非是纯虚函数,纯虚函数不能被实现。
通过连接其它合法的操作符可以创建新的操作符。例如:定义一个operator**得到一个新的操作符。
模块定义文件和__declspec(dllexport)一样具有导出功能。
explicit声明是禁止编译器执行非预期的类型转换。
当有新对象被创建的时候,往往是调用copy构造函数,没有新对象被创建的赋值是调用赋值函数。
在函数参数中以by value传递参数不是个好主意,往往用by refernce value传递比较好,这样才能真正的改变对象的内部的值,以by value传递的参数会调用copy构造函数。
用const替换#define宏。
函数形式宏最好用inline函数来替换。
为驳回编译器自助提供的功能,可以将相应的函数声明为private而且不加以实现。
心得:只有当class中有一个virtual函数的时候才把他的析构函数声明为virtual。
心得:不带任何virtual函数的class是不适合被当成基类的。
之所以将析构函数声明为virtual,至少这种情况是需要的,就是基类指针接受派生类指针的时候。
如果class拥有一个virtual函数,那么它就一定需要一个virtual析构函数。
设计目的如果不是用来作为base class,那么就不应该有virtual析构函数。
c++不喜欢析构函数吐出异常。
别让异常逃离析构函数。有两种方法:1.捕获析构函数中的异常,并用abort()函数提前终止程序。2.吞下异常
如果客户需要某对个操作函数运行期间抛出异常做出反应,最好将异常操作放到一个普通的函数而不是一个析构函数。
构造函数和析构函数不要调用virtual函数,因为这类调用不会下降至derived class那层。
令赋值操作符返回一个reference of *this.
coping函数应该确保对象内所有的成员变量和所有base class成分。
为防止资源泄露,往往在构造函数中获取资源,而在析构函数中释放资源。
使用raii classs 分别是tr1::share_ptr和tr1::auto_ptr,这两个都是智能指针,都可以自动释放资源,前者是比较好的选择,因为前者的复制动作不会影响被复制者的值,后者会使被复制者置为null。
在类中实现隐式转换函数即为operator后面加上类型符号,就是隐式类型转换函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值