编写高质量代码之改善C++程序语法篇2(从C到C++需要做的改变)

2015-01-27 14:12:52 · 作者: · 浏览: 21

?

?

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 代替#include 、#include 、#include

?

?

5 尽量使用C++风格的强制类型转换

即const_cast (a) static_cast (a) reiniterpret_cast (a) dynamic_cast (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. 指针和引用的自增(++)运算意义不一样;

?