C++基础知识之"细节加强"

fengjingtu

C++在C语言基础上发展而来,很多基础语法都是相同的,比如区块,数据类型,函数等等。但还有一些地方是不同的,我们先来看看这些小细节。

实用性增加

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

C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义

1
2
3
4
5
6
7
8
9
10

int test()
{
int a = 0;
a++;
int b = 0;//c语言会报错,只能在前面定义变量
b++;
printf("a=%d,b=%d\n", a, b);
return 0;
}

register 关键字增强

register关键字的作用: 请求编译器让变量直接放在寄存器里面,速度快。

在c语言中 register修饰的变量不能取地址,因为在寄存器中。早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。

但是C++编译器有自己的优化方式,不使用register也可能做优化。所以我们基本上不需要使用它,但是这个关键字依旧保留,而且可以取得register变量的地址,C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。

1
2
3
4
5
6
7
8
9

//C语言中的register不能取关键字
//C++中可以,一旦取关键字,register相当于无效
void register_demo()
{
register int a = 10;
printf("%d", &a);//因为此处取地址,所以上面定义的无效。,在C语言中会报错
return;
}

变量检测增强

在C语言中,重复定义多个同名的全局变量是合法的

在C++中,不允许定义多个同名的全局变量

C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上

int g_var;

int g_var = 1;

C++直接拒绝这种二义性的做法。

1
2
3
4
5
6
7
8

int g_var = 1;
//int g_var;//c语言中会允许全局变量同名,会被链接到同一地址空间上去。
int test()
{
printf("g_var=%d\n", g_var);
return 0;
}

struct 类型加强

C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型

C++中是一个新类型的定义声明。

1
2
3
4
5
6
7
8
9
10
11
12
struct Student
{
char name[100];
int age;
};

int test()
{
Student s1 = { "wang", 1 };//c++定义了一种新的类型
Student s2 = { "wang2", 2 };//c语言必须使用struct Student
return 0;
}

规范性增强

C++中所有的变量和函数都必须有类型
C语言中的默认类型在C++中是不合法的

在下面的函数中:
函数f的返回值是什么类型,参数又是什么类型?
函数g可以接受多少个参数?

1
2
3
4
5
6
7
8
9
10
11

//c语言允许没有返回值类型的函数
f(i)
{
printf("i=%d\n",i);
}
int test()
{
f(10);
return 0;
}

在C语言中

int f( );表示返回值为int,接受任意参数的函数。

int f(void);表示返回值为int的无参函数。

在C++中,int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数。

C++更加强调类型,任意的程序元素都必须显示指明类型。

以上这些都属于语法级别的增强。

新增bool类型

C++在C语言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占用一个字节,
如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示
bool类型只有true(非0)和false(0)两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false

1
2
3
4
5
6
7
8
9
10
11
12
int test()
{
bool b = true;
printf("b=%d,sizeof(b)=%d\n", b, sizeof(b));
b = 10;
printf("b=%d,sizeof(b)=%d\n", b, sizeof(b));
b = -1;
printf("b=%d,sizeof(b)=%d\n", b, sizeof(b));
b = 0;
printf("b=%d,sizeof(b)=%d\n", b, sizeof(b));
return 0;
}

三目运算符功能增强

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
int a = 10;
int b = 20;

//返回一个最小数 并且给最小数赋值成3
//三目运算符是一个表达式 ,表达式不可能做左值
(a < b ? a : b )= 30;
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}

上面这个函数在C语言中是不可以的,但在C++中可以。

C语言中的三目运算符返回的是变量值,不能作为左值使用

C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方

注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用

1
(a < b ? 1 : b )= 30;

那么思考一个问题:C语言如何支持类似C++的三目运算符特性呢?我们知道当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已。

1
*(a<b?&a:&b)=30//zaiC