【C++深度解析】1、C 到 C++ 的升级

1 C 和 C++ 的关系

  • C++ 继承了所有的 C 特性
  • C++ 在 C 的基础上提供了更多的语法和特性
  • C++ 的设计目标是运行效率和开发效率的统一

2 C 到 C++ 的升级

1、C++ 中所有的变量都可以在使用时再定义

对比:C 语言中的变量都必须在作用域开始的位置定义!!

int c = 0;
for(int i = 0; i <= 3; i++)
{
    for(int j = 1; j <= 3; j++)
    {
        c += i * j;
    }
}

经过尝试,用 C++ 编译器都可以编译运行,gcc 7.4.0可以编译运行,gcc 4.4.5 有编译错误,表明变量 i,j 应该在作用域开始的位置定义。

2、register 关键字变化

register 关键字请求编译器将局部变量存储于寄存器中

寄存器的运行速度大于内存,所以将变量存储在寄存器上可以加快运行速度,register 在 C 语言中只是向编译器请求,不保证一定成功。C++ 现代编译器经过优化,就算没有 register 也可能将变量存储在寄存器上,所以在 C++ 中 register 关键字就鸡肋,完全是为了兼容 C 语言。

不同:

  • C 语言中无法获取register变量的地址
  • C++ 中可以获得register变量的地址

由于寄存器不是内存,所以 C 语言中无法获取寄存器的内存地址。

3、全局变量

  • 在 C 语言中,重复定义多个同名的全局变量是合法的(最终被链接到全局数据区的同一个地址空间)
  • 在 C++ 中,不允许定义多个同名的全局变量

实例分析

// 2-1.c
#include<stdio.h>
int g_var;
// int g_var;
int main(int argc, char *argv[])
{
    printf("Begin...\n");
    int c = 0;
    for (int i = 1; i <= 3; i++)
    {
        for (int j = 1; j <= 3; j++)
        {
            c += i * j;
        }
    }
    printf("c = %d\n", c);
    register int a = 0;
    printf("&a = %p\n", &a);
    printf("End...\n");
	return 0;
}
  • 第 3,4 行全局变量,C++ 不能重复定义
  • i 和 j 在 for 循环使用时定义,C++编译器支持
  • 第 17,18 行,C++可以对 register 变量取地址

编译运行:

$ g++ 2-1.c -o 2-1
$ ./2-1
Begin...
c = 36
&a = 0x7ffc99eff858
End...

4、struct 关键字加强

  • C 语言中的 struct 定义了一组变量的集合,struct 定义的标示符并不是一种新的类型
  • C++ 中的 struct 用于定义一个全新的类型

在这里插入图片描述

5、c++中所有的变量和函数都必须有类型

  • C++ 中所有的标示符都必须显示的声明类型
  • C 语言中的默认类型在 C++中是不合法的

看下面的程序:
在这里插入图片描述
问题:
1、函数 f 的返回值和参数分别是什么类型?
2、函数 g 可以接受多少个参数

在 C 语言中

  • int f() 表示返回值为 int,接受任意参数的函数
  • f(void) 表示返回值为 int 的无参函数

在 C++ 中

  • int f() 和 int f(void) 具有相同的意义,表示返回值为 int 的无参数类型

实例分析

// 2-2.c
#include<stdio.h>
typedef struct _tag_student Student;
struct _tag_student
{
    const char* name;
    int age;
};
f(i)
{
    printf("i = %d\n", i);
}
g()
{
    return 5;
}
int main()
{
    Student s1 = {"Sun", 30};
    Student s2 = {"Sang", 30};
    f(10);
    printf("g() = %d\n", g(1,2,3,4,5));
    return 0;
}

上述代码用 C 语言编译器编译:

  • 第 3 行用typedef 将 struct _tag_student 取别名为 Student,不能用 Student 做结构体名称后直接定义 Student s1,因为 C 语言结构体表示变量集合,不是新数据类型
  • 第 9 行,函数 f(i) 默认参数为 int(可以不只一个参数),返回值为 int
  • 第 13 行,函数 g() 表示返回值为 int,接受任意参数的函数

编译运行:

$ gcc 2-2.c -o 2-2
2-2.c:9:1: warning: return type defaults to ‘int[-Wimplicit-int]
 f(i)
 ^
2-2.c: In function ‘f’:
2-2.c:9:1: warning: type of ‘i’ defaults to ‘int[-Wimplicit-int]
2-2.c: At top level:
2-2.c:13:1: warning: return type defaults to ‘int[-Wimplicit-int]
 g()
 ^
$ ./2-2
i = 10
g() = 5

编译器警告函数参数,返回类型默认为 int

当用 C++ 编译器编译时, struct 定义一个全新的类型,不用 typedef 重命名了,所有的标示符都必须显示的声明类型

3 小结

1、C++ 更强调使用,可以在任何地方声明变量
2、C++中的 register 只是一个兼容作用,C++ 编译器能更好的优化
3、C++ 中所有的标示符都必须显示的指明类型

发布了248 篇原创文章 · 获赞 115 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/104012047