偶然发现网络读书频道,http://book.51cto.com/art/201202/317549.htm,挺不错的希望CSDN也有,可能已经有了。。。
阅读《编写高质量代码--改善C++程序的150个建议》,总结归纳;
此文用以加深记忆,督促学习的目的
0 在C++中如何使用C的代码
如:int func( int a, char b);
c编译函数时不带函数的类型信息,上面的函数被编译成类似_Func的符号
c++为了实现重载,在编译时会加上函数的参数类型,上面的函数会被编译成类似_Func_int_char这样的符号
为了解决上面的矛盾,可以采取以下3中方式:
1) 修改C代码的头文件,当其中含有C++代码时,在声明中加入extern "C"
/*C语言头文件: CDemo.h*/ #ifndef C_SRC_DEMO_H #define C_SRC_DEMO_H extern "C" int Func(int x,int y); #endif /*C实现文件:CDemo.c*/ #include " CDemo.h " int Func(int x,int y ) { ...... } //C++中调用 #include " CDemo.h " int main() { Func(1,6); return 0; }
2) 在C++代码中重新声明以下C函数,在重新声明时添加上extern "C"
/*C语言头文件: CDemo.h*/ #ifndef C_SRC_DEMO_H #define C_SRC_DEMO_H extern int Func(int x,int y); #endif /*C实现文件:CDemo.c*/ #include " CDemo.h " int Func(int x,int y ) { ...... } //C++中调用 #include " CDemo.h " extern "C" int Func(int x,int y); int main() { Func(1,6); return 0; }
3) 在包含C头文件时,添加extern "C"
/*C语言头文件: CDemo.h*/ #ifndef C_SRC_DEMO_H #define C_SRC_DEMO_H extern int Func(int x,int y); #endif /*C实现文件:CDemo.c*/ #include " CDemo.h " int Func(int x,int y ) { ...... } //C++中调用 extern "C" { #include " CDemo.h " } int main() { Func(1,6); return 0; }
1 小心使用memcpy系列的函数
memcpy、memset、memcmp系列函数对C风格的数据类型简介安全
但是由于C++的多态,使用虚函数时,类的每一次继承都会产生一个虚函数表,其中存放的是指向虚函数的指针,这些虚函数表必须存放在对象体中,也就是说和对象的数据放在一起,这样对象在内存里并不是以连续的方式存放的,所以使用memcpy系列函数可能导致无法预料的错误。
2 尽量使用new/delete代替malloc/free
mollac与new之间的区别:
1) new 是C++的运算符,而malloc是C的标准库函数
2) new创建的东西具有类型,而malloc返回的是void*,需要强制类型转换
3) new可以自动调用对象的构造函数,而malloc不会
4) new失败会调用new_handler处理函数,malloc失败会直接返回null
free与delete
delete是C++的运算符,free是C的库函数
delete可以自动调用对象的析构函数,而free不会
3 灵活的使用不同风格的注释
2种不同的注释方法: // 表示注释单行;/* 和*/组合注释两者中间的所有代码
4 尽量使用C++标准的iostream
建议用#include <iostream>代替#include <iostream.h>、#include <stdio.h>、#include<cstdio>
5 尽量使用C++风格的强制类型转换
即const_cast<T*>(a) static_cast<T*>(a)
reiniterpret_cast<T*>(a) dynamic_cast<T*>(a)
6 尽量用const、enum、inline替换#define
先偷会懒,嘿嘿,http://book.51cto.com/art/201202/317613.htm
7 用引用代替指针
★ 相同点:
1. 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;
引用是某块内存的别名。
★ 区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
引用“从一而终” ^_^
4. 引用没有 const,指针有 const,const 的指针不可变;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为类成员名称时,其占用空间与指针相同4个字节(没找到标准的规定)。
7. 指针和引用的自增(++)运算意义不一样;