关闭

【C++】C++中的C

标签: c++
376人阅读 评论(0) 收藏 举报
分类:

C++兼容C,但同样的东西,在C++C中的表现可能不同,下面总结了一些。

1、函数空参

int f();

函数空参时,C表示任意参数,C++表示没有参数。

int f(void);

C表示没有参数时使用void。

2、函数参数标识符

int f(int a);
int f(int);

声明函数时,CC++都可以省略标识符。

int f(int a) {}
int f(int) {} // C++

定义函数时,C++可以省略标识符,C不可以省略标识符。

3、函数返回类型

int foo();
foo(); // C

C++函数原型必须指明函数的返回值类型,在C中,如果省略返回值,表示默认为整型。

4、函数声明与定义

void foo(float a) {}
foo(100);

CC++中编译函数的方式是不同的,以上面的foo函数为例,C编译出来的符号信息就是个简单的函数名,即foo,而C++还包括参数的类型信息,即_Z3fooi,_Z是一个固定的标识符,后面的3表示其后的函数名foo的长度为3,最后的i表示函数的参数类型为int,所以C++支持函数重载。调用没有声明的函数在C中是可以的,但是在C++中不可以。C中虽然允许调用没有声明的函数,但不声明很可能会带来很难发现的bug,以上面的foo函数为例,参数类型为float,但函数传递进来的参数类型为int,如果调用之前声明了这个函数的原型,那么int类型会自动提升为float,没有问题,但如果没有声明的话,编译器认为foo函数原型的参数类型就是int而不进行类型转换,因为C函数的符号信息不包括参数的类型,自然也发现不了这个问题,所以潜在的问题就来了。

5、变量定义

int i; for (i = 0; i < 100; ++i) {}
for (int i = 0; i < 100; ++i) {} // C++

C/C++都要求变量在使用前必须定义,但C强制在作用域的开始处就定义所有的变量,以便在编译器创建一个块时,能给所有这些变量分配空间,而C++允许在在作用域的任意地放定义变量,所以可以在正好使用它之前定义,甚至还可以在if语句的条件表达式、switch的选择器语句、for循环和while循环的控制表达式内定义变量。

6、头文件include

#include <stdio.h>
#include <cstdio> // C++
#include <iostream> // C++

include头文件的方式以标准IO库为例,见上面的例子,如果在同一C++程序中混用两种形式,即带头文件后缀和不带头文件后缀,会遇到某些问题。

7、类型转换

int a = 100;
float b = (float)a;
float b = float(a); // C++

除了隐式类型转换外,更多的是显式类型转换。在C中,将转换的类型放在括号中,而在C++中,可以将转换的变量放在括号中。

int a = 0;
void *b = &a;
int *c = b; // ok in C, but ng in C++
int *d = (int*)b; // ok in both C and C++

对于void指针的用法也是不同的,见上面的例子。另外,C++还提供了四个特有的类型转换,请参照C++】深入理解C++的各关键字一文中的cast说明。

8、复合类型

struct A a;
enum B b;
union C c;
A a; // C++
B b; // C++
C c; // C++

typedef struct {} A;
A a;

b++; // ok in C, but ng in C++

C中的struct、enum、union定义变量时必须同时给出关键字,而C++中可以省略这些关键字,在C中也可以省略这些关键字的方法是使用typedef。C中的enum是直接与int关联的,可以进行运算,而C++则不行,类型检查更严。另外,C++还引入了class,是struct的升级版,提供了成员函数等更多强大的功能。

9、指针与引用

int foo(int *a);
int foo(int &a); // C++

C中,通过函数修改函数外部的变量时,函数的参数类型需要使用指针,按地址传递,而不是普通类型的按值传递,在C++中,除了指针之外,又引入了引用类型,可以完成同样的功能。
在函数参数中使用常量引用特别重要,这时因为我们的函数也许会接受临时对象,这个临时对象是由另一个函数的返回值创立或由函数使用者显式创立的,临时对象总是不变的,因此如果不使用常量引用,参数将不会被编译器接受。在效率方面,传值方式需要调用构造函数和析构函数,然而如果不想改变参数,则可以通过常量引用传递,它仅需要将地址压栈。
使用引用时有一定的规则:
1)当引用被创建时,它必须被初始化,指针则可以在任何时候被初始化。
2)一旦一个引用被初始化为指向一个对象,它就不能改变为另一个对象的引用,指针则可以在任何时候指向另一个对象。
3)不可能有NULL引用,必须确保引用是和一块合法的存储单元关联。

10、动态内存

int *p = malloc(sizeof(int));
free(p);
p = malloc(sizeof(int) * 10);
free(p);

int *p = new int; // C++
delete p;
p = new int[10];
delete[] p;

动态内存分配,C中使用malloc和free,C++引入了new和delete。

11、const

const关键字的用法请参照C++】深入理解C++的各关键字一文中的const说明。

1
0
查看评论

C++和C混编时变量和函数的定义和使用

背景 项目中经常遇到C++和C语言混编的情况,例如性能要求必须使用C语言实现功能,开发要求使用C++实现界面。这种情况下,会出现很多C++和C混编问题,下面就我自己的项目经验谈谈可能遇到的问题和解决方法,如果有误或不当之处还请海涵并请不吝指教。 问题及解决 原因 出现问题的根源主要包含以下两...
  • laishaofa
  • laishaofa
  • 2015-10-11 20:27
  • 692

c/c++中内存分配

在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题。 第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的存储结构和运行结构,同时还介绍了堆空间和栈...
  • msdnwolaile
  • msdnwolaile
  • 2016-02-21 17:30
  • 904

C和C++中struct使用的区别

今天参看了louden用c编写的编译器,发现其中一些地方使用struct很奇妙。所以又研究了一下struct的区别,并发现c和c++在某些地方是有区别的。 struct作为类的一种特例,是用来自定义数据结构的,在编程的过程中是很有用的。C和C++的主要区别是:一个结构标记声明后,C...
  • CSDNwei
  • CSDNwei
  • 2016-02-19 14:39
  • 1476

C++/C 宏定义(define)中#和## 的含义

#是字符串化的意思,出现在宏定义中的#是把跟在后面的参数转成一个字符串; ##是连接符号,把参数连接在一起。 例子: #include using namespace std; #define A(exp) cout << "I am "#exp <<...
  • fireblue1990
  • fireblue1990
  • 2017-02-17 14:57
  • 332

c/c++中指针的理解(初学者)

关于指针,大家肯定不陌生,一些初学者,想必会出现思绪混乱的情况,现在我就来帮大家缕一缕吧。(第一次写微博 有点小紧张) 大家应该了解一些计算机对内存的管理方式吧。操作系统会将内存单元进行编号,这些编号都是有顺序的,大家应该听过操作系统分为32位和64位的吧,这个就是操作系统对内存的最大编号,32...
  • Allen_ww
  • Allen_ww
  • 2016-01-11 19:41
  • 9497

C/C++中strcpy和strncpy的区别

两个都是string.h头文件中实现拷贝字符串数组功能的函数。两者的区别从字面上就可以理解,前者正常拷贝整个字符串到另一个字符串数组,后者拷贝前n个字符到另一个字符串数组。2.语法//都是参数后者拷贝给前者
  • FX677588
  • FX677588
  • 2016-09-29 11:08
  • 3904

linux下c程序c++程序混合编译,c程序中调用c++程序,c语言项目与c++语言项目的合并

把两个开源项目合并到一起,但是一个是c编写,一个是c++编写,在linux环境下实现两个项目的混合编译,以及互相的调用。
  • u012559520
  • u012559520
  • 2016-08-25 10:53
  • 1579

C 和 C++ 的输入输出总结

本文为 C 和 C++ 的各种输入输出做一个总结,对比学习才更有效。欢迎补充。
  • Lmerissa
  • Lmerissa
  • 2016-01-18 14:21
  • 2246

c调用c++的类函数

http://bbs.sjtu.edu.cn/bbscon?board=C&file=M.1300711242.A 在c++中定义了一个类,现在需要在c中调用这个类中的函数。add.h        &...
  • aiwoziji13
  • aiwoziji13
  • 2011-06-09 18:33
  • 4996

C如何调用C++的库

<br />前段时间遇到了一个C调用C++的接口的问题,现在把思路整理一下。<br />提供给我们的是C++头文件(.h)和静态库(.a)<br />C不可以直接调用C++,我们采用C++调用C++的方法,另外建一个适配层<br />在我们的C++适配...
  • pochuanpiao
  • pochuanpiao
  • 2010-07-16 20:15
  • 5086
    个人资料
    • 访问:382631次
    • 积分:6668
    • 等级:
    • 排名:第4243名
    • 原创:263篇
    • 转载:0篇
    • 译文:5篇
    • 评论:52条
    Make Others Better.
    博客专栏
    文章分类