19. 明白在c++中如何使用c

c++可以兼容c的绝大部分代码,但是还是有一部分不能兼容。

c语言的编译器在调用函数时会把函数翻译成 : “_函数名”,例如:

int nasa(int a,intb)

c语言编译器会将其翻译成:“_nasa”的形式,当调用此函数时就去寻找这个字符串。

c++语言的编译器在调用函数时会把函数翻译成:“_函数名_参数类型_参数类型”,例如:

int nasa(int a,int a)

c++编译器会将其翻译成:“_nasa_int_int” 的形式,当调用此函数时就去寻找这个字符串。

这也是c语言没有函数重载,而c++有函数重载的原因

在c++程序中使用c就需要解决这个问题,通过使用extren “c”

有三种方式使用其来在c++程序中使用c

(1)

/*在c语言的头文件中在函数的声明前加上extren “c”
//例如: //c语言头文件 c_1.h
extren "c" int nasa(int x,int y); //c语言文件 c_2.c
#include "c_1.h"
int nasa(int x,int y)
{
//code
} //c++调用文件
#include "c_1.h"
int main()
{
int m=nasa(1,2);
return 0;
}

(2)

/*在c语言头文件中函数声明前加上extren,在c++调用文件中再次声明函数并在前面加上extren “c”
//例如: //c语言头文件 c_1.h
extren int nasa(int x,int y); //c语言文件 c_2.c
#include "c_1.h"
int nasa(int x,int y)
{
//code
} //c++调用文件
#include "c_1.h"
extren "c" int nasa(int x,int y);
int main()
{
int m=nasa(1,2);
return 0;
}

(3)

/*在c语言头文件函数声明前加上extren,在c++调用文件时在引用头文件前加上extren “c”  */
//例如: //c语言头文件 c_1.h
extren int nasa(int x,int y); //c语言文件 c_2.c
#include "c_1.h"
int nasa(int x,int y)
{
//code
} //c++调用文件
extren "c"
{
#include "c_1.h"
}
int main()
{
int m=nasa(1,2);
return 0;
}

20.使用memcpy系列函数时不能操作类类型的对象

21. 尽量用new/delete,代替malloc/free

new/delete是c++中新增的关键字,而malloc/free是c的标准库函数。

(1)对于普通类型的对象而言

用二者没有太大区别,但注意malloc动态分配内存返回void *,需要进行强制类型转换后才能使用,而new则不同,其直接返回相应类型的指针,可以直接使用。

(2)对于类类型的对象而言

因为new在动态申请空间的同时会调用构造函数(delete会调用析构函数)

而malloc则不会调用构造函数,不能用malloc来动态建立类类型的对象。

总结 :c++保留malloc/free是为了解决一些兼容性的问题,new/delete的功能完全找过它,所以在使用时尽量使用new,而不用malloc。

22. 灵活使用不同风格的注释

(1)版权声明,文件名称等一些信息用C语言风格的 /* /

(2)内嵌注释用 c++风格的注释 //

(3)宏尾端的注释用 /
*/

(4)因为函数的声明语句一般是在头文件中,而函数的定义语句是在源程序文件中,

如果函数的参数中含有默认参数那么在声明语句中要注明,如此在定义语句中为了更直观准确的使用此函数需要利用注释的形式来表示含有默认参数的参数。

int nasa(int a,int y /*=2*/)

有c风格的注释 /* */ 来表示参数y的默认参数值为2,而用c++风格的注释就不能实现此功能

23. 使用c++标准的iostream

即使用operator<<和operator>>,而不使用printf( )和scanf( )

printf()缺点是

(1)不支持自定义类型

(2)不支持类型安全检查

(3)使用较复杂,格式控制较麻烦

24. 尽量使用c++类型的强制转换

尽量少使用强制类型转换,但是有时候不得不用。

25. 尽量用const,enum,inline替代#define

源程序文件要经过 (预处理-》编译-》链接) 三个过程以后才能被计算机执行。

其中预处理是由预处理器完成的,定义的宏也是在这一过程中被处理的。

但是预处理器处理宏时只是单纯的进行符号替换,如:

(1)#define PI 3.14159

预处理器把所有的PI符号都换成3.1415926,那么如果程序因为PI出错误,而编译器肯本接触不到PI这个符号,只能试图去寻找3.14159数值的出处(如果这个宏定义是在他人的头文件中定义的,则去寻找会很费事费力)

我们应该使用const PI=3.1415926

这是定义一个PI常量,出错之后编译器可以接触到,找错比较方便清晰。

(2)#define add(a,b) ((a)+(b))

“函数宏”:但是其并不等同函数,如果误把其当成函数使用会带来意想不到的错误。

但其优点是加快了程序执行的效率。(有利有弊)

inline  int add(int& a,int& b)
{
return a+b;
}

这时候考虑使用内联函数,其也实现了在预处理阶段把调用函数的语句直接换成函数体从而提高程序的运行效率,而且其他方面其和普通函数无异(但注意内联函数只包含一些简单的语句,不包含像循环这样费时的语句,因为包含这些语句其就没有什么实际意义了)

26.使用引用代替指针

引用可以理解为 “变量的别名”。

为什么用引用代替指针呢,因为指针理解起来较困难,是程序看起来很复杂,晦涩难懂。

而引用很容易理解,增加了代码的可读性。

而且指针在使用的时候需要额外申请空间来存放变量地址,而引用在使用时不需要去申请任何空间

改善c++程序的150个建议(读后总结)-------19-26的更多相关文章

  1. 编写高质量代码_改善C++程序的150个建议 读书笔记

    这几天看了下这本书<编写高质量代码_改善C++程序的150个建议>,觉的蛮有收获的,再次记录下自己以前不清晰的知识点,以供学习. 编写符合标准的main函数 C语言标准规定了main函数的 ...

  2. 改善c++程序的150个建议(读后总结)-------12-18

    12.优先使用前置操作符 #include <iostream> using namespace std; class A { private: int num; public: A op ...

  3. 改善c++程序的150个建议(读后总结)-------10-11

    10. 优化结构体中元素的布局 结构体变量所占空间大小并不是其所含类型所占字节数之和,其所占内存字节数涉及到字节对齐. 字节对齐 :变量在内存中储存都是以字节数为单位,每一个字节都有自己的地址,逻辑上 ...

  4. 改善c++程序的150个建议(读后总结)-------0-9

    0. 不要让main 函数返回 void 入口函数main()返回类型应该为 int, 即程序结束时return 0 表示程序正常返回,函数结束时 return -1 值表示程序异常返回, 如果不显式 ...

  5. 改善c++程序的150个建议(读后总结)-------27-35

    27. 区分内存分配的方式 c++中内存分为5个不同的区 ①栈区 栈是一种特殊的数据结构,其存取数据特点为(先进后出,后进先出).栈区中主要用于存储一些函数的入口地址,函数调用时的实参值以及局部变量. ...

  6. 改善C++ 程序的150个建议学习之建议7:时刻提防内存溢出

    作为一个程序员,对内存溢出问题肯定不陌生,它已经是软件开发历史上存在了近40年的大难题.在内存空间中,当要表示的数据超出了计算机为该数据分配的空 间范围时,就产生了溢出,而溢出的多余数据则可以作为指令 ...

  7. 编写高质量代码改善C#程序的157个建议——建议150:使用匿名方法、Lambda表达式代替方法

    建议150:使用匿名方法.Lambda表达式代替方法 方法体如果过小(如小于3行),专门为此定义一个方法就会显得过于繁琐.比如: static void SampeMethod() { List< ...

  8. 改善java程序的151个建议

    <编写高质量代码-改善java程序的151个建议> --秦小波 第一章.开发中通用的方法和准则 1.不要在常量和变量中出现易混淆的字母 long a=0l; --> long a=0 ...

  9. 编写高质量代码改善java程序的151个建议——导航开篇

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

随机推荐

  1. Python-tkinter-window

    示例代码讲解 1.加载tkinter模块 2.创建一个窗口 3.设置窗口的主题 4.开始窗口的事件循环 import tkinter 2 win = tkinter.Tk() 3 win.title( ...

  2. Git修改用户名、邮箱和密码

    $ git config --global --replace-all user.name "要修改的用户名" $ git config --global --replace-al ...

  3. 谈谈对IOC及DI的理解与思考

    一.前言 在实际的开发过程中,我们经常会遇到这样的情况,在进行调试分析问题的时候,经常需要记录日志信息,这时可以采用输出到控制台. 因此,我们通常会定义一个日志类,来实现输出日志. 定义一个生成验证的 ...

  4. 以绝对优势立足:从CDN和云存储来聊聊云生态的崛起

    以绝对优势立足:从CDN和云存储来聊聊云生态的崛起 前面几期文章我们介绍了混合云模式,以及面向应用层的云架构解决方案的Spring Cloud.接下来,我们就以蘑菇街的两个具体案例,来分享一下基于混合 ...

  5. [Azure Devops] 使用 Azure Pipelines 实现 CI

    1. 什么是 Azure Pipelines Azure Pipelines 会自动构建和测试代码项目,以将其提供给其他人.它适用于任何语言或项目类型.Azure Pipelines 结合了持续集成 ...

  6. 如何快速编写一个微信Api?

    概述 Magicodes.Wx.Sdk致力于打造最简洁最易于使用的微信Sdk,逐步包括公众号Sdk.小程序Sdk.企业微信Sdk等,以及Abp VNext集成. 本篇将侧重于讲述如何向Magicode ...

  7. 经典变长指令SIB

    前言 ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的. 这时就在ModR/M后面增加一个SIB字节, ...

  8. 快速了解Web MVC设计模式

    MVC概述 MVC即 Model-View-Controller 的缩写,是按照职责划分模块一种设计模式,其中Model是核心. Model:模型.负责执行实际的业务,包含数据操作,可以向视图推送数据 ...

  9. 01-MySQL Linux安装

    一.检查当前系统是否安装过mysql rpm -qa|grep mysql 或 ps -ef|grep mysql 二.安装mysql服务端 rpm -ivh MySQL-server-5.5.48- ...

  10. 【观隅】数据集管理与可视化平台-NABCD分析

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-初次邂逅,需求分析 项目介绍 观隅 数据集管理与可视化平台(取"观一隅而知全局" ...