版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1.C与C++的关系
- C++继承了所有的C特性
- C++在C的基础上提供了更多的语法和特性
- C++的设计目标是运行效率与开发效率的统一
2.C到C++的升级
2.1 C++更强调语言的实用性,所有的变量都可以在需要时候再定义
-
int c =
0;
-
-
for(
int i =
0; i <=
3; i++)
-
{
-
for(
int j =
1; j <=
3; j++)
-
{
-
c += i * j;
-
}
-
}
2.2 register关键字变化
- register关键字请求编译器将局部变量存储于寄存器中
- c语言无法获得register关键字地址
- C++编译器有自己的优化方式
- C语言中无法获取register变量的地址
- C++中可以获得register变量的地址
- 现代编译器都可以优化,决定是否能放寄存器,
- 这是早期C++编译器做法,现代c++编译器面前register形同虚设
- 因此在C++中register关键字显得鸡肋,完全是因为要兼容C语言
- C++中的register关键字
- C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效
- 早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充
-
#include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
register
int c =
0;
-
-
printf(
"Begin...\n");
-
-
printf(
"&c = %08X\n", &c);
-
-
printf(
"End...\n");
-
-
printf(
"Press enter to continue ...");
-
-
getchar();
-
-
return
0;
-
}
2.3 全局变量
- 在C语言中,重复定义多个同名的全局变量是合法的
- C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。
- 在C++中,不允许定义多个同名的全局变量
-
#include <stdio.h>
-
-
int g_var;
-
//int g_var = 1;
-
extern
int g_var =
1;
-
-
int main(int argc, char *argv[])
-
{
-
printf(
"Begin...\n");
-
-
printf(
"g_var = %d\n", g_var);
-
-
printf(
"End...\n");
-
-
printf(
"Press enter to continue ...");
-
-
getchar();
-
-
return
0;
-
}
- 去掉extern关键字,会出现错误e:\cp_projects\c++面向对象编程\demo_1\c到c++升级\1-3.cpp(4): error C2086: “int g_var”: 重定义,c+++直接拒绝这种二义性的做法。
2.3 struct类型的增强
- C语言中的struct定义了一组变量的集合
- C语言中struct定义的标识符并不是一种新的类型
- C++中的struct用于定义一个全新的类型
2.4 c++中所有的变量和函数都必须有类型
- C语言中的默认类型在C++中是不合法的
-
f( i )
-
{
-
printf(
"i = %d\n", i);
-
}
-
-
g()
-
{
-
return
5;
-
}
- 函数f的返回值和参数分别是什么类型?函数g可以接受多少个参数?
- 在C语言中
- int f()表示返回值为int, 接受任意参数的函数
- f(void)表示返回值为int的无参函数
- 在C++中
- int f()和int f(void)具有相同的意义,表示函数返回值为int的无参函数
-
#include <stdio.h>
-
-
struct Student
-
{
-
const
char* name;
-
int age;
-
};
-
-
f( i )
-
{
-
printf(
"i = %d\n", i);
-
}
-
-
g()
-
{
-
return
5;
-
}
-
-
int main(int argc, char *argv[])
-
{
-
struct Student s1 = {
"wss",
30};
-
struct Student s2 = {
"nyist",
30};
-
-
f(
10);
-
-
printf(
"g() = %d\n", g(
1,
2,
3,
4,
5));
-
-
return
0;
-
}
- 毫无疑问C++编译不通过, C++绝不允许默认类型,e:\cp_projects\c++面向对象编程\demo_1\c到c++升级\1-6.cpp(4): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认int
3.小结
- C++以C语言为基础进行了加强:
- C++更强调实用性,可以在任意的地方声明变量。
- C++中的register只是一个向后兼容的作用,C++编译器能够进行更好的变量优化。
- C++更加强调类型,任意的程序元素都必须显示指明类型。