<C++程序设计>指针,引用,构造和虚构函数,复制构

2017-12-23  本文已影响10人  zhouluyao

指针

pta = &a 通过pta可以找到a的地址

我们将存放地址的变量称之为指针变量,这里的地址就是指针,指针也是数据类型 *是指针类型变量的标志符号

定义一个指针变量系统为该指针分配一定大小的内存,在C++中,每个指针变量的大小为8字节

int a,*pta;//先定义变量 pta = &a;

pta = &a; 不可写成 *pta = &a;

*pta并不表示指针变量pta,而表示pta指向的变量a,指针变量与指针变量所指向的变量是完全不同的概念

&变量名 //获取变量的内存地址

char name[50];

name是字符数组,name的首地址也就是&name[0]

char str[81],*pstr;

str ="abcd";数组名是常量指针,不能被赋值

Template <calss T> class指某种类型(char ,int ,struct)

指针:指向变量的地址

程序运行时,函数会占有连续的内存空间,函数名就是内存空间的起始地址

int &r = n; //r引用了n,r的类型就是int &,某个变量的引用相当于这个变量的别名

int &r=n; //r引用了n,n就是r,r就是n

引用的概念:

1.一定要初始化成引用某个变量

2.初始化后它就一直引用该变量,不再引用别的变量(从一而终)

3.引用只能引用变量不能引用常量和表达式

int n1,n2;

swap(n1,n2);

Void swap(int &a,int &b){

Int tmp;

tmp =a;

a=b;

b=tmp;

}

常引用,定义引用时,前面加const关键字,即为“常引用”

const int &r = n; //r的类型是const int &,不能通过常引用去修改其引用的内容

Const int &r =n; r=200;//编译错

对象的大小 = 所有成员变量的大小之和

CRetangle r1,r2;

用法1:对象名.成员名 r1.w =5;

用法2:指针->成员名 CRetangle *p1 =&r1; //定义指针p1指向对象r1的首地址 p1->w =5;

用法3:引用名.成员名 CRetangle r2; CRetangle &rr =r2; rr.w =5;

类就是自己定义的数据类型

new出来对象的返回值是指针(*)

CSample *array = new CSample[2];

delete []array;//动态创建的对象要用delete删除

有*说明是指针数组,不是对象数组

Test *pArray[3];//不会导致对象的生成,是一个指针就不是对象,不会引发对象的生成

对operator = 返回值类型的讨论,void好不好?

考虑a =b =c; 等价于 a.operator = (b.operator= (c));

只有返回一个引用时,才可以作为下一个函数作用的对象

一个函数的返回值如果它不是引用的话,我们是不能把函数的返回值写在“=”左边的

构造和虚构函数

构造函数:名字和类名相同,可以有参数,不能有返回值

对象占用的存储空间是不是构造函数分配的?构造函数是在对象已经占用的存储空间做一些初始化的工作,如果把对象比作房子,构造函数不是盖房子只是进行装修

定义时没写构造函数,编译器会默认生成一个无参的构造函数

为什么需要构造函数?

1.执行必要的初始化工作

2.程序没有初始化就使用会导致报错

new出来对象的返回值是指针(*)

CSample *array = new CSample[2];

delete []array;//动态创建的对象要用delete删除

有*说明是指针数组,不是对象数组

Test *pArray[3];//不会导致对象的生成,是一个指针就不是对象,不会引发对象的生成

类就是自己定义的数据类型

复制构造函数

为string编写复制构造函数的原因,防止调用默认构造函数浅copy导致内存空间被多次释放的问题
String::string(String &s){

if(s.str)

{

str = new char[strlen(s.str) +1];

strcpy(str,s.str);

}

}



CArray a;

for(int i=0;i<5;i++)

a.push_back(i);

a[3] = 100;

CFArray a4(a);//a4是用复制构造函数初始化的,a4是a的复制品,a4和a的内容存储在不同的内存空间

派生类对象的体积 = 基类对象的体积 +派生类对象自己的成员变量的体积 ,派生类对象包含着基类对象,积累对象存储的位置位于派生类对象新增的成员变量之前

class cDog;

Class cMaster {

cDog dogs[10];

}

Class cDog{

cMaster m;

}

循环定义计算不出体积大小,为了避免循环定义,为“业主”类设置一个“狗”类的对象指针数组

class cMaster{

cDog *dogs[10];//10个元素的指针数组,每个元素都是一个指针,字节数就是40个字节

}
上一篇下一篇

猜你喜欢

热点阅读