一、C++相较于C,实用性增强
C语言中的变量理论上都必须在作用域开始的位置定义!!即:必须先全部定义初始化完成后在使用;而不能先定义一部分,在执行后面语句的时候突然想起再定义。 (理论上是不可以的,但部分编译器也会编译通过) C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。随时需要的时候再随时定义即可。 简单来讲就是C语言比较讲规矩,墨守成规,大家默认的规则就是先在指定的地方集中先定义初始化,后面在直接用;而C++比较机灵,C++的一切行径都是为了实用而不是为了美观或者规范, 因为大家编代码的时候,可能你并不知道你后面会用到那些变量,扎堆定义确实是比较麻烦的,当然也是美观度,但是不够实用。
C++就是最求实用,比如在for循环中 for(int i=0;i<10;i++) 在C++中是完全没问题的
二、C++的类中为什么需要引入成员函数的概念?
我们都知道C++中的类(class)和C语言中的结构体有异曲同工之妙,但是类中多了一种类型:“函数”。是的,被称为“成员函数”。
#include<iostream>
using namespace std;//c++的命名空间
class circle
{
public:
double r;
double pi = 3.1415926;
double area = pi*r*r;
};
// 2010编译不通过 但是在2013编译器能编译通过
int main()
{
circle c1;
cout << "please input your r" << endl;
cin >> c1.r;
cout << c1.area << endl; //乱码
system("pause");
return 0;
}
看如上例子:这个代码实际上编译只有两种结果,要么直接编译不通过,要么编译通过,但结果与实际值不相符(结果随机)!
分析:1、首先类是不占用内存空间的,当定义一个对象c1的时候,成员变量全部分配空间并完成初始化,r为随机值,pi为3.1415926,area直接计算不保留等号右边的算式,因为r随机,那么area自然也是随机值。
2、后面再输入的r值并不会印象area的结果,因为公式在输入r值之前就已经消失了。那么公式就失去的原本的作用;
3、因此:结论:在类中直适合直接定义变量(成员变量),如果要定义方法则需要借助成员函数来定义实现。
三、C++和C中register的意义
register关键字 :修饰变量,请求编译器让变量a直接放在寄存器里面,速度快(注意只是请求建议,register没有资格强迫编译器这么做)
1、在c语言中 register修饰的变量不能取地址(&a),c编译器不会甄别优化,一般会按照你的建议去干,放在寄存器上的变量不能取地址。(和内存的存储结构和机制有差异)
2、在c++里面可以取register变量的地址,当你要取register地址的时候,编译器会使register对变量的声明变得无效,因此变量依旧存储在内存上,可以取内存地址。
3、c++编译器比较智能,会甄别和优化,当需要存在寄存器上时,即使不加register(就是即使没有建议这么干),编译器也会将变量存储至寄存器;相反当没有必要的时候,即使你强加了register声明,编译器也不会照做。甚至如上情况,register被采纳通过了,但是当发现你要取地址的时候,立马让其无效不通过,怎么样,是不是很灵活智能!
四、struct关键字在C++和C语言中的差异
在C++中struct关键字类型相较于C语言中,功能得到增强 !
struct teacher
{
char name[32];
int age;
};
/*
typedef struct teacher //作为替换方法typedef不是关注点,但是我也附上
{
char name[32];
int age;
}teacher;
*/
//关注点:
struct teacher ang; //C语言可用 C++可用
// C原因必须带上struct teacher 整体作为数据类型名
teacher ang; //C++可用
// C++ 不要求必须有struct , teacher 就可以作为数据类型名,
// 但是还是建议协商struct毕竟C语言用法已经习惯了。
上面的代码例子:
C语言struct用法:缺少struct——不行;typedef替换——也是整体替换而不是单独省掉struct
1、struct teacher ach; struct必不可缺,否者C编译器不识别为数据类型
2、使用typedef ,将struct teacher作为类型名整体替换为新类型名,但即便是这样,C语言中struct依旧不可被单独撇下
C ++ struct用法:C语言能行的都行,C语言不允许的也可以
五、bool数据类型在C++和C语言中的差异
布尔类型(bool)是 C++ 新增的一种基本数据类型。在标准的 C语言中没有那个数据类型可以直接定义bool数据。
即:如下代码只能在C++中这样定义,而C语言中不行(C语言中没有bool的定义类型)
bool b1 = true;
bool b2 = false;
bool b3 = 1;
bool b4 = 0;
bool b5 = 54; //C++可以赋值true、false 也可以赋值 1、0、54(任意数)
在C语言中如果需要使用 bool 类型,程序员可以通过宏定义来自定义一个 bool 类型,定义语句如下:
#define bool int
#define false 0
//C语言不能使用false、true;并且数据类型一般是int型,没有bool型的定义法
#define true 1
也就是将 int 型定义为 bool 型,将 int 型的 0 和 1 两个值分别定义为 bool 类型的两个值 true 和 false。但是在 C++ 中则不需要这么麻烦,C++ 中对 bool 类型已经做出了定义。
六、三目运算符功能增强(C和C++编译器的表现)
int main()
{
int a = 10;
int b = 20;
//返回一个最小数 并且给最小数赋值成30
//三目运算符是一个表达式 ,表达式不可能做左值
(a < b ? a : b )= 30;
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
结论
1、C语言返回变量的值 C++语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用*(返回的变量值不能立即被赋值)
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
2、注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
(a < b ? 1 : b )= 30;
3、C语言如何支持类似C++的特性呢?
当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已