C++深度解析 C到C++的升级(1)
参考:【C++ Primer Plus(第六版)4.4 结构 7 函数】
C++语言的意思:
所有的变量都可以在需要使用时再定义
(对比:C语言中的变量都必须在作用域开始的位置定义)
int c = 0;
for (int i =1; i <= 3; i++)
{
for(int j = 1; j <= 3; j++)
{
c += i * j;
}
}
register关键字请求编译器将局部变量存储于寄存器中,效率提高
- 在C++中依然支持register关键字
- C++编译器有自己的优化方式
- C语言无法获取register变量的地址
- C++中可以取得register变量的地址
- C++编译器发现程序中需要取register变量地址时,register对变量的声明变得无效,形同虚设。
C++拒绝二义性的做法
在C语言中,重复定义多个同名的全局变量是合法的
(C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上)
在C++中,不允许定义多个同名的全局变量
/* C++直接拒绝这种二义性的做法 */
int g_var;
int g_var = 1;
示例代码:
#include <stdio.h>
//全局变量
int g_v;
//int g_v; //错误的。拒绝同名的变量出现
int main(int argc, char *argv[])
{
printf("Begin...\n");
int c = 0;//如果是C,要在main函数作用域起始位置定义
for (int i = 1; i <= 3; i++)//int i
{
for(int j = 1; j <= 3; j++)
{
c += i *j;
}
}
printf("c = %d\n", c);
//合法的,在c++,忽略register,不可能取到寄存器的地址,因为地址都是针对内存来说的
register int a = 0;
printf("&c = %p\n", &a);
printf("End...\n");
return 0;
}
struct 关键字的加强
C语言中的struct定义了一组变量的集合
C语言中struct定义的标识符并不是一种新的类型
C++中的struct用于定义一个全新的类型
C++:
//定义了一个名为Student的新类型
struct Student
{
const char* name;
int age;
};
C语言:
typedef struct _tag_student Student;
struct _tag_student
{
const char* name;
int age;
};
面试题:int f()和int f(void)有区别吗?
它们有没有区别,具体看用什么编译器!!!
C++中,所有的标识符都必须显示的声明类型
在C语言中:
int f()表示返回值为int,接受任意多个参数的函数。
f(void)表示f返回值为int的无参函数,不接受任何参数。
在C++中:(C++对类型的检查非常严格,不允许默认类型)
int f()和int f(void)具有相同的意义,不接受任何参数,表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型。
示例代码:
C++:(C++中所有变量和函数都必须有类型)
#include <stdio.h>
//Student代表新的类型名
struct Student
{
const char* name;
int age;
};
//C++不允许默认类型!!!!!
/*
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
*/
int main(int argc, char *argv[])
{
Student s1 = {"Delphi", 38};
Student s2 = {"Tang", 38};
//f(10); //错误
//printf("g() = %d\n", g(1, 2, 3, 4, 5)); //错误
return 0;
}
C:(C语言允许默认类型)
#include <stdio.h>
typedef struct _tag_student Student;
struct _tag_student
{
const char* name;
int age;
};
f(i) // int f(int i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
int main(int argc, char* argv[])
{
Student s1 = {"Delphi", 30};
Student s2 = {"Tang", 30};
f(10);
printf("g() = %d\n", g(1, 2, 3, 4, 5));
return 0;
}
结果如下:
小结
C++更强调实用性,可以在任意的地方声明变量
C++中的register只是一个兼容的作用
C++编译器能够更好的进行优化
C++中的任意标识符都必须显示的指明类型