目录
"实用性"增加
在C语言中,变量需要提前定义,如果出现一条语句,再补充定义一条变量,就会报错。如:
#include "iostream"
using namespace std;
//C语言中的变量都必须在作用域开始的位置定义!!
//C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。
int main11()
{
int i = 0;
printf("ddd");
int k;
system("pause");
return 0;
}
变量k没有提前定义,而是在运行中间定义的,就会报错。当然,这种问题是针对于编译器的,如果是用C的编译器,就会报错,如果是用C++的编译器,就不会报错了。
register 关键字增强
register关键字的作用(在C语言中)是请求编译器让变量a直接放在寄存器里面运行(寄存器是没法取地址的,如取地址的话,就会在C编译器中会报错),这样做可以使程序运行速度快。
如下代码,在C编译器上就不能通过,而在C++编译器上就可以通过:
void main42()
{
register int a = 0;
printf("&a: %d \n", &a); //不能在寄存器变量上取地址
system("pause");
}
这是因为:
1. register关键字请求“编译器”将局部变量存储于寄存器中,C语言中无法取得register变量地址,在C++中依然支持register关键字,但C++编译器有自己的优化方式,不使用register也可以会做优化,同时,C++中是可以取得register变量的地址的。这句话应该这么理解:如下:
for (int i=0; i<1000; i++) //不使用register也可能做优化
{
printf("i:%d \n", i);
}
像这种频繁使用变量i的时候,c++会自动对i进行优化,加快程序的执行速度。意思说,即使不定义关键字,C++编译器也能根据情况,来进行优化。
2. C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
3. 早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。
变量检测的增强
先看个例子:
int g_a = 100;
//int g_a ;
void main()
{
printf("hello...g_a:%d \n", g_a);
}
可以看出,这段代码明显是错误的,但在C编译器下,是可以运行的,而在C++编译器中是不可以被运行的,可以被检查出来,这就是所谓的变量检查的增强。
在C语言中,重复定义多个同名的全局变量是合法的,在C++中,不允许定义多个同名的全局变量,C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。如下一个例子:
int g_var;
int g_var = 1;
C++会直接拒绝这种二义性的做法。
struct类型加强
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型。
C++中的struct是一个新类型的定义声明。
struct Teacher
{
public:
char name[32];
int age;
protected:
int a;
};
void main51()
{
Teacher t1; //
t1.age = 10;
printf("hello...\n");
system("pause");
}
C++中,struct 关键字和class关键字所完成的功能是一样的 。但它俩还是有区别的,以后讲到。
对数据类型检查的增强
C++中所有的变量和函数都必须有类型,即C++对类型的检查将更加严格。
比如说,在C语言里面,可以写:
f(i)
{
printf("i = %d\n", i);
}
根本就不知道i是个什么类型,就能让打印出来了!
g()
{
return 5;
}
函数内啥都没有, 就能直接返回输出一个5。 这些都是C语言中的"灰色地带",这也是C语言不好的地方,C++对这些进行了摒弃和优化。
C++中所有的变量和函数都必须有类型,C语言中的默认类型在C++中是不合法的!
新增Bool类型关键字
在C语言中就用不了,是C++新增的数据类型。
测试下Bool类型所占用的内存空间:
bool b1 = true; //告诉c++编译器给我分配 1个字节的内存
cout<<"sizeof(bool)"<<sizeof(bool)<<endl;
所占用的内存空间是1个字节。
C++中的bool可取的值只有true和false,理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现。
true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示
bool类型只有true(非0)和false(0)两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false
总体代码
dm04_实用性增强_register_类型检查.cpp
#include <iostream>
using namespace std;
//C语言中的变量都必须在作用域开始的位置定义!!
//C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。
void main41()
{
int i;
printf("hello...\n");
int k;
i = 10;
k = 11;
printf("i:%d k:%d \n", i, k);
system("pause");
}
void main42()
{
register int a = 0;
printf("&a: %d \n", &a); //不能在寄存器变量上取地址
for (int i=0; i<1000; i++) //不使用register也可能做优化
{
printf("i:%d \n", i);
}
system("pause");
}
/*
在C语言中,重复定义多个同名的全局变量是合法的
在C++中,不允许定义多个同名的全局变量
C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上
int g_var;
int g_var = 1;
C++直接拒绝这种二义性的做法。
*/
int g_a = 100;
//int g_a ;
void main()
{
printf("hello...g_a:%d \n", g_a);
}
dm05_struct类型加强.cpp
#include <iostream>
using namespace std;
//struct 关键字 class关键字 完成的功能是一样的
//区别后面介绍 抛砖
class c1
{
public:
protected:
private:
};
struct Teacher
{
public:
char name[32];
int age;
protected:
int a;
};
void main51()
{
Teacher t1; //
t1.age = 10;
printf("hello...\n");
system("pause");
}
/*
C++中所有的变量和函数都必须有类型
C语言中的默认类型在C++中是不合法的
函数f的返回值是什么类型,参数又是什么类型?
函数g可以接受多少个参数?
*/
/*
//更换成.cpp试试
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
int main(int argc, char *argv[])
{
f(10);
printf("g() = %d\n", g(1, 2, 3, 4, 5));
getchar();
return 0;
}
*/
dm06_bool类型.cpp
#include <iostream>
using namespace std;
void main()
{
bool b1 = true; //告诉c++编译器给我分配 1个字节的内存
bool b2, b3, b4, b5;
//
cout<<"sizeof(bool)"<<sizeof(bool)<<endl;
//bool变量 1 或者 0
b1 = 10;
cout<<"bl:" <<b1<<endl;
//bool变量 1 或者 0
b1 = -10;
cout<<"bl:" <<b1<<endl;
//bool变量 1 或者 0
b1 = 0;
cout<<"bl:" <<b1<<endl;
cout<<"hello..."<<endl;
system("pause");
return ;
}