首页 > 代码库 > 编写高质量代码之改善C++程序语法篇2<从C到C++需要做的改变>

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

    偶然发现网络读书频道,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. 指针和引用的自增(++)运算意义不一样;


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