C++ 学习笔记

个人记录:

1、strcpy_s 原型:strcpy_s( char *dst,   size_t num,   const char *src ),也可以像strcpy一样只接收两个参数,但第一个参数必须是char型数组,而不能是new出来的指针。也就是必须显式指出可复制的长度。

2、在VS的C++代码中,指针直接比较大小,编译器并不会直接报错,但直接比较指针通常来说是没有意义的,返回的只是虚拟地址的大小,比较字符串要使用strcmp( )函数。

3、自己设计的类中含有动态内存分配变量(使用new)时,首先要注意析构函数不可省略,然后就是显式定义复制构造函数和赋值操作符,以避免类的两个(或多个)对象成员指针指向同一个地址,对象销毁时对一个地址多次delete,造成不确定的、有害的后果。

4、普通类型可自动转换为const类型,但const类型不能自动转换为普通类型,函数重载时,const和非const也是不同的函数特征标,所以重载<<或其它操作符时,若要使用const类的成员变量,还应提供对应的const函数版本。

5、cin.get(char*array,int count,char delim)与cin.getline(char*array,int count,char delim)的不同点:

(1)、当输入的字符数小于count时遇到字符delim,get函数不会读取delim这个字符,而getline函数将读取这个字符但是不存进array当中去,而是将其丢弃,当然,两者都会在读取的字符串后面自动加上'\0'

(2)、当输入的字符数大于count时,则get函数只读取count-1个字符,而其余的字符仍然保存在缓冲区中,还可再对其进行读取;函数getline同样读取count-1个字符,不同的是getline()会设置失效位(faibit),并且关闭后面的输入,这个时候用ch=cin.get();是读取不到留在输入队列中的字符的。

 

6、定义const常量时,编译器也为其分配了空间,但编译时,已对该常量进行值替换,这与#define类似;可用强制转换将其地址赋给int型指针,并对其修改,其不可修改的特性是编译器语法分析的结果,并不是其所在的内存不可写入。详情查看链接:http://www.cnblogs.com/wuqi/p/4573028.html 。

7、类声明中不能初始化成员变量,因为类声明只是描述如何分配内存,但并不分配内存。对于静态成员变量,虽然其不依赖于类对象独立存储,但在声明中初始化,会导致有多个文件需要包含类声明时,重复声明和初始化,所以 only static const integral data members can be initialized within a class  ,这是VS的报错,也就是只有静态的,const类型的,整型的成员变量可以在类声明中进行初始化。

8、生成dll时,导出函数必须要使用_declspec(dllexport)声明,否则无法使用该函数,一个导出函数都没定义的话,lib文件都不会生成。而dll的用户可以不使用__declspec(dllimport)来导入,但使用可以告知编译器该函数在dll中,提高运行效率,所以建议使用。那么就会涉及到dll头文件的定义问题,在vs2013中新建dll工程后默认会增加两个预处理器定义_USRDLLDLL_EXPORTS,可以利用这个来定义一个通用的格式:

#ifdef DLL_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif

当然也可以手动定义,或者修改预处理器定义的名称来标识。还有declspec(dllexport)前面一个下划线和两个下划线似乎都可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值