我们一直说的C++与C的最大区别就在于,C++是面向对象的,即C语言+面向对象方法论就成了我们的C++。而什么是面向对象呢,通俗的说就是将现实世界中的事物直接映射到程序中,可直接满足用户需求。这样,它的优势就在于它构建的软件能够适应用户需求的不断变化,以及直接利用面向过程方法的优势而避开其劣势。当然,现代软件系统一般都是用多种语言编写而成,C++也是其中不可或缺的一部分,也是学号其他语言相当重要的一个途径。
接下来,就是一些C++对C语言一些方面的加强:1)命名空间:为了解决合作开发时的命名冲突问题,C++引入了命名空间的概念。利用namespace 关键字可以定义一个命名空间,其中可以包含很多类型,也可以嵌套使用。使用时,主要有以下3种方法:(1):域解析符“ ::”。如:NameA::a = 2;
(2):using 关键字,有效范围为当前{}。如:using namespace NameA;
(3):对命名空间中单个元素多次使用时。如:using NameA ::swap;
此外,直接使用“::”符号就是指全局变量
2)int a;
double b;
cin >> a >> b;
cout << "a = " << a << " ,b = " << b << endl;
cin与cout支持输入输出所有基本类型数据,在iostream中定义;
<< 与 >> , 在这边被重载,指数据的流向,支持连续操作;
endl 表示换行,等同于"\n";
3)C++语言增强了语言的“实用性”,所有变量不需要在作用域开始时定义,而是在需要使用时定义;
4)对于寄存器变量,C语言中无法取到register变量的地址,而C++则支持,但会将register对变量的声明变得无效。
5)在C++中不允许全局变量的重复定义。
6)C++中认为结构体是新的变量类型,可以直接用来定义变量。如:Student std = {19, "zhang"};
此外,C++结构体中可以存放函数,但函数不参加结构体大小的计算。
7)c++中的所有变量和函数都必须要有类型说明,c中的int()返回值为整型,参数任意,但c++中int()与int(void)都表示无参函数,
8)新增bool类型, bool类型只有true(非0)和false(0)两个值。
9)三目运算符的加强,C++中三目运算符返回的是变量本身,可以作为左值使用。
10)const关键字,C中它修饰的只是一个常变量,本质还是变量,有自己的地址空间。但C++中则直接修饰为常量,存放在长量表中。但这边的const修饰与宏定义又有所区别,宏定义是预编译期间直接替换,没有类型与作用域检查,但const会有。
11)接下来的这个是比较重要的拓展:引用
int a = 10; int &b = a;
这边的b就是a的一个引用,其本质可以看成是这样一个常指针(它也占用4个字节的空间):
int * const b = &a;
它就是为内存a重新取了一个名字叫做b,通常在C++中用引用来代替指针。
当函数返回值是引用时需要注意的点:
1、不能返回栈上的引用,同指针一样,只能返回静态变量和全局变量的引用。
2、如果用引用去接,接回来的自然是一个引用;但要是用普通变量去接,接回来的就是一个值。
3、可以作为左值来使用。
常引用: const int & b = c
不能通过引用来改变被引用的值。
它的初始化有2种方式:
1、引用普通变量,不能改变变量的值:int a = 100; const int & b = a;
2、使用常量初始化常引用:const int & a = 10;
当使用这种初始化方式时,编译器会为这个常量分配一个空间,将这个常量的值复制到这块空间中,然后让这个常引用作为这块空间的别名,即生成了一个只读变量。
12)内联函数
C++中添加了内联函数来替代宏函数,只需要在普通函数前加上关键字inline就构成了一个内联函数。inline关键字必须和函数定义放在一起,如果是和函数声明放在一起的话,会被忽略。与宏函数被预编译器处理不同,inline是由编译器处理的,它会有函数参数检测,返回值检测,作用域检测。inline是在请求调用时进行函数替换(但编译器可能会拒绝),一旦内联成功,代码就没有这一段函数。
内联函数体不能过长(最好不超过5行),不能有循环语句,不能有复杂的if语句,不能对内联函数进行取址操作。
13)默认参数与占位参数
首先来看默认参数,当函数调用时没有提供该参数的值时会使用默认参数,在有默认值的参数后面的参数必须得有默认参数;
int mul (int a, int b = 5, int c = 10){}
占位参数是指函数的参数只有类型没有变量名:
int add (int a, int b, int) {}
为了以后的程序扩展留下线索,C++引入了占位参数,其实它的存在类似我们之前学习过的无名位域:
struct A
{
unsigned int a:10;
unsigned int b:10;
unsigned int :10;
unsigned int c: 2;
};
今天遇到一个问题,回来修改一下这里:
在声明和定义函数时,只需要一处写默认参数,不然会出现编译编译时会报重定义的问题(写在声明中比较直观,也方便修改)
14)函数重载:函数名相同,但参数不同,根据调用时传的参数类型或数量不同决定调用哪个函数;
下面是一些注意点:
函数的返回值不能作为函数重载的判断条件;
普通变量参数:int a 与const int a 不能重载 ; 引用参数:int &a 与const int &a 能重载
函数重载与函数默认参数同时使用会导致二义性;
当一个重载函数赋给一个函数指针时,需要严格匹配指针类型,并且根据重载规则挑选与函数指针参数列表一致的候选者。