前面我们了解了namespace的概念以及应用,现在我们对比一下c和c++,看看c++对c有哪些增强
"实用性"增强
- C语言中的变量都必须在作用域开始时定义.
- C++中更强调语言的"实用性",所有变量都可以在需要使用时定义.
#include<iostream>
int main()
{
int i=0;
cout<<"i = "<<i<<endl;
int k=4;
cout<<"k = "<<k<<endl;
return 0;
}
变量检测增强
- 在c语言中,重复定义多个同名的全局变量是合法的.
- 在c++中,不允许定义多个同名的全局变量.
- c语言中多个同名的全局变量最终都会被链接到全局数据区的同一个地址当中.
//此代码错误,无法执行
#include<iostream>
int g_var;
int g_var = 1;
//c++直接拒绝这种二义性的做法
int main()
{
printf("g_var=%d\n",g_var);
return 0;
}
struct类型的增强
- C语言的struct定义了一组变量的集合,c编译器并不认为这是一种新的类型.
- C++中的struct是一种新类型的定义声明
#include<iostream>
struct Student
{
char name[64];
int age;
};
int main()
{
//Student是一种新的数据类型
Student s1={"wang",1};
Student s2={"wang2",2};
return 0;
}
变量和函数的加强
- c++中所有的变量和函数都必须有类型.
- c语言中的默认类型在c++中是不合法的.
//c语言的代码
f(i)
{
printf("i = %d\n",i);
}
g()
{
return 5;
}
int main()
{
f(10);
printf("g() = %d\n",g(1,2,3,4));
getchar();
return 0;
}
对于上面的代码,我们考虑两个问题:
- 函数f的返回值类型是什么?,参数又是什么类型?
- 函数g可以接收几个参数?
注意:下面的问题结果是在c语言中的情况
对于第一个问题:
f的返回值是void,参数是void
对于第二个问题:
函数g可以接收无数个参数
再将上述代码转化为c++文件,看看结果是什么?
是不可以运行的
因为c++对语法要求更为严格
即:c++中所有的变量和函数都必须有类型.
变量和函数的加强总结
在c语言中
- int f():表示返回值为int,接受任意参数的函数,
- int f(void):表示返回值为int的无参函数
在c++中
- int f() 与 int f(void)具有相同的意义,都是表示返回值为int的无参函数
所以在c++中,更加强调类型,任意的程序元素都必须显示指明类型
新增bool类型
- c++在c语言基本类型上增加了布尔类型
- c++中的bool类型理论上c++的bool类型只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现,
- true表示真值.编译器内部用1表示, false表示非真值,编译器内部用0表示.
- bool类型只有true(非0)和false(0)两个值.
#include<iostream>
using namespace std;
int main())
{
int a;
bool b=true;
printf("b = %d,sizeof(b) = %d\n",b,sizeof(b));
b=4;
a=b;
printf("a = %d,b = %d\n", a, b);
b=-4;
a=b;
printf("a = %d,b = d\n",a,b);
a=10;
b=a;
printf("a = %d,b = %d\n",a,b);
b=0;
printf("b = %d\n",b);
return 0;
}
三⽬运算符功能增强
首先我们先来看一段代码:
#include<iostream>
using namespace std;
int main(void)
{
int a=10;
int b=20;
//返回⼀个最⼩数 并且给最⼩数赋值成30
//三目运算符是⼀个表达式 ,表达式不可能做左值
(a<b?a:b)=30;
printf("a = %d, b = %d\n", a, b);
return 0;
}
这段代码,我们放在c编译器下,是不能运行的,因为c语言中表达式不能作为左值,因此,c++加强了三目运算符,表达式返回的值是变量的本身,也就是说,执行完(a<b?a:b)时,c++编译器返回了b变量,返回了变量本身,所以执行三目运算符后,接下来执行的是b=30;,因此可以通过编译运行.而c语言中的三目运算符返回的是变量的值,也就是b的值20
- 表达式不能作为左值,例如:(a < b ? a : b) = 30; 在c语言中不能运行
- 在c语言中,表达式的元素结果,放在寄存器中
- 在c语言中,表达式的返回值是一个数
- 在c++中,表达式返回的值是变量本身
注意:三目运算符可能返回值中如果有一个是常量值,则不能作为左值使用,例如:(a<b)?1:b
当左值的条件:要有内存空间,c++编译器帮助我们取一个地址而已
const加强
const是常量的标识符,我们来看看c++对const的定义
const的基本语法
const是常量定义符,const的定义意味着只读
#include<iostream>
using namespace std;
int main(void)
{
//const 定义常量---> const 意味只读
const int a;
int const b;
//第⼀个第⼆个意思⼀样 代表⼀个常整形数
const int *c;
//第三个 c是⼀个指向常整数的指针(所指向的内存数据不能被修改,但是本⾝可以修改)
int * const d;
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
const int * const e ;
//第五个 e⼀个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
return 0;
}
合理的利用const的好处,
1指针做函数参数,可以有效的提高代码可读性,减少bug;
2清楚的分清参数的输入和输出特性
int setTeacher_err( const Teacher *p)
const修改形参的时候,在利用形参不能修改指针所向的内存空间
c语言的"冒牌货"
#include<stdio.h>
int main()
{
const int a=10;
int *p=&a;
printf("a = %d\n",a);
*p=11;
printf("a = %d\n",a);
return 0;
}
从上面的例子可以看出,c语言中虽然使用const定义了变量,但通过间接赋值的方式,可以改变数值大小.所以在c语言中,const定义的变量,不是真正意义的常量,仍然可以改变数值的大小
但是在c++中,const是一个真正的常量,通过任何方式都不可以改变,const修饰的变量在常量编译期间,就已经确定下来了
const和#define的相同之处
#include<stdio.h>
#define N 20
int main()
{
const int a=20;
const int b=10;
int array[a+b]={0};
int i=0;
for(int i=0;i<(a+b);i++)
{
printf("array[%d] = %d\n",i,array[i]);
}
printf("%d",N);
return 0;
}
const与#define都是用于定义常量,在c语言中,建议使用#define,在c++中建议使用const
const与#define的不同之处
#include<iostream>
void fun1()
{
#define a 10
const int b = 20;
}
void fun2()
{
printf("a = %d\n",a);
//printf("b = %d\n", b); 这个无法执行,因为b是函数的局部变量
}
int main()
{
fun1();
fun2();
return 0;
}
可以看到,#define定义的变量,在全局范围内,都可以使用,但是const变量的定义,与常规变量定义的规则是相同的
对const与#define的相同不同之处的总结
- c++的const常量类似于宏定义:const int c=5; 和 #define c 5效果相同
- c++的const常量与宏定义不同:const常量是由编译器处理的,提供类型检查和作用域检查,而宏定义由预处理器处理,单纯的文本替换.
const变量的总结:
- C语言中const变量是只读变量,有自己的存储空间
- C++中的const常量:
1. 可能分配存储空间,也可能不分配存储空间
2. 当const常量为全局,并且需要在其它文件中使用,会分配存储空间
3. 当使用&操作符,取const常量的地址时,会分配存储空间
4. 当const int &a = 10; const修饰引用时,也会分配存储空间
枚举变量的加强
- c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值.
- c++中枚举变量, 只能用被枚举出来的元素初始化.
#include<iostream>
using namespace std;
enum season {SPR,SUM,AUT,WIN};
int main()
{
enum season s=SPR;
//s = 0;//error,但是C语⾔可以通过
s=SUM;
cout<<"s = "<<s<<endl;//1
return 0;
}