C++:01.从C到C++:引用,inline,函数重载,全局和局部变量,this,new与malloc

头文件:C++的标准输入输出头文件#include <iostream>。一般还配有using namespace std;表示使用std名命空间。


在C++中,声明一个函数时,可以为函数的参数指定默认值。当调用该函数时,如果没有参数,将使用默认值作为参数。


面向对象语言:

四大特征:封装(在语言上是通过访问限定符体现的:public private)        继承       多态       抽象         三大:去掉抽象。

如何用oop思想来设计代码(软件):实体(属性和行为)  ->  ADT(abstract  data  type)  ->  类  ->  对象

类并不占空间,对象占空间。类相当于图纸,对象相当于房子

oop语言:程序=对象+对象+对象。。。+消息交互

类与类之间常用关系:组合   继承。


引用:

类型名 &引用名 = 同类型的某变量名; 
eg:
int a = 10;
int & b = a;

引用相当起别名。

注意:

1、引用实际是通过指针实现的。引用实际上就是一个常量指针。目标是为了提供比指针更高的安全性,因为常量指针一旦与变量地址绑定将不能更改,这样降低了指针的危险系数,它提供了一种一对一的指针。参数传引用的方法类似与指针。

2、引用在内存中占4个字节。因为在表达式中,使用引用就像使用变量本身,所以使用sizeof运算符是得不到引用本身的大小。要想得到引用的大小,我们可以定义一个类,该类的私有成员是一个引用,在使用sizeof来计算该类的大小。

3、引用不占空间的意思是不占用对象空间,不表示不占指针的少量空间。引用类型的变量会占用内存空间,占用的内存空间的大小和指针类型的大小是相同的。 从上面的汇编代码可以看出,虽然引用是一个对象的别名,但是在汇编层面,和指针是一样的。

4,定义引用一定要初始化。引用只能引用变量。

5、常引用和常指针类似,都是不能通过常引用取修改其引用的内容。

补充:常量成员变量和引用成员变量必须在构造函数的初始化列表中进行初始化。常量型成员变量的值一旦初始化,就不能再改变。


内联函数:inline

内联函数,直接在代码里展开,不用函数调用开销。

一般的函数使用虽然能够避免代码重写多次,还能减少可执行程序的体积,但也会造成运行时间上的开销。虽然说这个开销可以忽略不计,但如果函数内部语句很少,本身执行时间还不如调用函数所需的时间长,我们就可以将这个函数写为内联函数。

在函数前加上inline关键字即可。内联函数和普通函数的区别在于:当编译器处理调用内联函数的语句时,不会将该语句编译成函数调用的指令,而是直接将整个函数体的代码插人调用语句处,就像整个函数体在调用处被重写了一遍一样。很显然这样增加了体积,但速度提高了,就是用空间换时间

注意:调用内联函数前必须有内联函数的定义,不能只出现声明。


函数重载:

只要参数表不同即可。返回值不同,参数表相同不叫重载,叫重定义。注意:编译导致二义性会报错。

在c语言中是不支持函数重载的,原因:在于符号!c语言函数生成符号跟函数名有关,所以导致同名函数符号一样。c++符号不仅与函数名有关还和参数有关,所以不会导致同名函数符号相同,所以可以重载。


全局变量和局部变量:

全局变量:在程序载入内存时就已经分配好了存储空间,运行期间地址不变。初始化为0。

局部变量:初始化为随机值。其定义在函数内,存储空间是动态分配在栈中的,因为函数每次被调用时局部变量被保存的地址不一样,其自动初始化的工作不是一次性的,这会带来无谓的开销。


this指针:

在C++语言中,同一个类可以定义很多对象,并共用成员方法,那么一个成员方法,如何区分不同对象的数据?

用this指针,是类成员函数默认的第一个参数,是对象的地址,传参的时候一般省略。

全局函数没有this指针。

void registerGoods(CGoods *this,char *n,int a,double g)
{
    strcpy(_name,n);
    //strcpy(this->_name, n);//这里的this指针其实是该函数默认的第一个参数,
                             //是对象的地址,再传参的时候省略了。
                             //毕竟从汇编来说,C++的汇编码还是使用C的。
}

new与malloc:
1、malloc和free都是C语言的库函数;         new和delete是运算符 (sizeof)      sizeof也是运算符

2、malloc是按字节分配内存的;                  new是按指定类型的个数分配内存的

3、malloc开辟的内存不带初始化操作;       new开辟内存可以自带初始化,会自动调用构造函数

4、malloc开辟内存失败返回值是NULL;     new开辟内存会抛出bad_alloc类型的异常对象

5、free是需要传入释放内存的起始地址就可以;delete是需要区分释放单个元素内存和数组内存的,在释放数组内存时,delete和指针中间,要加上[],如 delete []p;当然delete与free在释放完之后,都需将指针置为空

如何处理抛出的异常:
try
{
    int *p = new int;   //有很多catch块,抛出的异常,与那个catch相同进入哪个catch
} 
catch(const bad_alloc &err)      //正确方法,但实际上很少会出现这种情况,所以一般并不需要考虑
{
}

 简单点理解:new先申请内存(底层用malloc实现),然后调用类型的构造函数(初始化成员)。

                       delete先调用析构函数(清理成员),然后释放内存(底层用free实现)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章