编写高质量代码之改善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. 指针和引用的自增(++)运算意义不一样;

时间: 2024-11-09 19:24:29

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

每周一书-编写高质量代码:改善C程序代码的125个建议

首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10余年开发经验的资深C语言专家全面从C语法和C11标准两大方面深入探讨编写高质量C代码的技巧.禁忌和实践 C语言因为既具有高级语言特性,又具有汇编语言特性,所以它是近二十几年来使用较为广泛.生命力较强的编程语言.无论是操作系统.嵌入式系统.普通应用软件,还是移动智能设备开发,它都能够很好地胜任,是公认的强大的语

代码质量优先——《编写高质量代码:改善c程序代码的125个建议》

高质量的代码不但可以促进团队合作.减少bug处理.降低维护成本,对程序员自身的成长也是至关重要的.很难想象一个参考<如何编写无法维护的代码>写代码的程序员技术成长的上限有多么低.为了写出高质量的代码,我们需要听取过来人的改善代码质量的经验,<编写高质量代码:改善c程序代码的125个建议>就是一本能让人写出高质量代码的好书. 本书的第三章<程序控制语句应该保持简洁高效>首先用简练的语言介绍了流程控制结构的概念,然后提供了对if.else.for.do-while.swit

[ 转 ]编写高质量代码:改善Java程序的151个建议

记得3年前刚到公司,同桌同事见我无事可做就借我看<编写高质量代码:改善Java程序的151个建议>这本书,当时看了几页没上心就没研究了.到上个月在公司偶然看到,于是乎又找来看看,我的天,真是非常多的干货,对于我这种静不下心的人真是帮助莫大呀. 看完整本书,也记了不少笔记,我就分享一部分个人觉得有意义的内容,也为了方便以后自己温习. --警惕自增陷阱 i++表示先赋值后自增,而++i表示先自增后赋值.下面的代码返回结果为0,因为lastAdd++有返回值,而返回值是自增前的值(在自增前变量的原始

《编写高质量代码:改善Python程序的91个建议》读后感

编写高质量代码:改善Python程序的91个建议  http://book.douban.com/subject/25910544/ 1.(建议16)is 用于判断两个对象的id是否相等,==才是判断值是否相等 2.(建议23)for,while,和try语句后面都可以跟else语句,可以简化代码 3.(建议18) __init__.py模块可以写代码,import时只需要 import 包(文件夹) 4.(建议19)用import a 而不是 from a import b ,可以避免嵌套导入

编写高质量代码,改善C++程序的150个建议:指针、初始化和运算符

建议0:不要让main函数返回void 首先C++ 标准中从没有出现过void main(){}这样的函数定义. 标准的主函数定义有两种: int main() int main(int argc,char * argv[]) 在main函数中,return 语句的作用在于离开main函数(析构掉所有具有动态生存时间的对象),并将其返回值作为参数来调用exit函数.如果函数执行到结尾儿没有遇到return 语句,其效果就等于执行了return 0. 建议1:区分0 的四种面孔 1)整形0.作为一

《编写高质量代码:改善JavaScript程序的188个建议》学习小记(一)

作者介绍: 成林,资深Web前端工程师,从事Web前端工作多年,精通CSS.HTML.JavaScript.jQuery和Ajax等Web前端技术,在实践中积累了大量的经验.推崇Web技术标准,曾经在多所高等院校和一些线下技术沙龙主讲Web标准和规范相关的课程,曾经还参与过W3C组织的标准化文档的中文编译工作.近几年来,集中精力研究和实践CSS3和 HTML 5前沿技术,在国内是该领域的先驱者之一. 其中书的目录分类为以下几部分: 第1章 JavaScript语言基础 第2章 字符串.正则表达式

读《编写高质量代码:改善JavaScript程序的188个建议》1

建议3:减少全局变量污染 定义全局变量有3种方式: ?在任何函数外面直接执行var语句. var f='value'; ?直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f='value'; ?直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f='value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让那

《编写高质量代码:改善Java程序的151个建议》笔记

To fight the unthinkable,you have to be willing to do the unthinkable. 不要在循环中使用try catch,应该放在循环的外面. One Line 务必让常量的值在运行期间保持不变. 保证三元操作符中的两个操作类型一致. 反序列化时构造方法不会执行. 在序列化类中,不使用构造方法为final变量赋值. 避免为final变量复杂赋值. 发布应用系统时,禁止使用类文件替换方式,整体WAR包发布才是万全之策. 包装类型参与运算时,要

《编写高质量代码:改善c++程序的150个建议》

这本书没什么新东西,大部分是effective c++或者其它书的摘抄,下面记录下我可能在编程时会忽略的几点. 1. 结构体内变量布局:按类型大小从小到大声明. 2. 在c++代码中引入大量c代码,注意下是否要加入extern "c".(c++重载,函数名会加标志) 3. 用智能指针管理new对象. 4. 用成员初始化列表进行初始化. 5. 不用拷贝等函数时,私有化它. 6. 模板的声明和定义都放在头文件中. 7. 尽量减少函数参数个数,因为参数个数的增加会使函数进栈出栈的次数增加(多