指针
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个字节
}