对象生存期
- C++中对象的种类
- 全局对象
先定义后使用;程序启动时创建,运行结束时释放 - 局部对象
谁定义谁使用,所在函数被调用时创建,从函数返回前释放 - 堆对象
通过指针向该对象的指针访问,即能够得到指针即可使用;由delete命令释放
#include<iostream>
using namespace std;
class CMyDate
{private:
int year,month,day;
public:
CMyDate(int y=0,int m=0,int d=0)
{
printf("创建(%d,%d,%d)\n",y,m,d);
year=y,month=m,day=d;
}
~CMyDate()
{
printf("释放(%d,%d,%d)\n",year,month,day);
}
void Show()
{ printf("%d-%d-%d\n",year,month,day);}
};
CMyDate china(1949,10,1); //全局对象:程序启动创建,运行结束释放
void Func(double x,double y)
{
CMyDate w(2010,12,23); //局部对象:调用函数创建,从函数返回前释放
w.Show();
cout<<x<<','<<y<<endl;
china.Show();
}
int main()
{
CMyDate x(2017,7,15);
Func(2.75,4.1);
CMyDate *q=new CMyDate(1988,8,13); //堆对象:调用时创建,由delete释放
q->Show();
Func(-0.5,1.96);
delete q;
}
- 对象的创建与释放
#include<iostream>
using namespace std;
class CMyDate
{private:
int year,month,day;
public:
CMyDate(int y=0,int m=0,int d=0)
{
printf("创建(%d,%d,%d)\n",y,m,d);
year=y,month=m,day=d;
}
~CMyDate()
{
printf("释放(%d,%d,%d)\n",year,month,day);
}
void Show()
{ printf("%d-%d-%d\n",year,month,day);}
};
CMyDate china(1949,10,1); //全局对象:程序启动创建,运行结束释放
void Func(double x,double y)
{
CMyDate w(2010,12,23); //局部对象:调用函数创建,从函数返回前释放
w.Show();
cout<<x<<','<<y<<endl;
china.Show();
}
int main()
{
CMyDate x(2017,7,15);
Func(2.75,4.1);
CMyDate *q=new CMyDate(1988,8,13); //堆对象:调用时创建,由delete释放
q->Show();
Func(-0.5,1.96);
delete q;
}
- Java的情况
1.只有堆对象
2.只有new没有delete
对象的储存
- 内存划分
1.程序区
2.静态区
3.动态区(栈)
4.空闲区 - 对象的数据成员在数据区分配储存单元(根据情况安排静态区还是动态区,用new申请则放在原空闲区,同变量分配),而函数成员全部存放在程序区
- 每个对象的数据成员(可视作结构体)在数据区中有自己的存储空间,各12字节
- 类的函数成员(不论该类现在有多少个对象)只在程序区存放一份程序代码
void CMyDate::Show()//带形参,指向对象的指针
//void CMyDate::Show(CMyDate *This)
//“::”是C++的作用域限定符,简称域限定符或域限制符, 类::标识符
{
printf("%d-%d-%d",this->year,this->month,this->day);// “->”通常省略
int main()
{
CMyDate bir(1949,10,1);
bir.Show();//调用时取对象的地址
//bir.Show(&bir)
……
- this指针小结
- this是C++的保留字
- this相当于一个指针变量,存在于每一个类的函数 成员当中,是函数成员的一个隐含参数(类的每一个成员自带this指针变量)
- 函数成员被调用时,this将被设置为对象的数据成员的起始地址,该操作只能由系统自动处理
对象名.函数(实际参数) |
---|
指针->函数(实际参数 |
- 函数成员内编写代码时,“数据成员”都是“this->数据成员”的简写
- 不能用命令对this进行赋值,不能取它的地址(由系统掌握的特殊指针变量)
- **Java的this
指针**
class MyDate
{ private int year,month,day;
public MyDate(int y,int m,int d)
{ year=y; //是this.year的简写
month=m;
day=d;
}
public void Show()
{
System.out.printf("%d-%d-%d",year,month,day);//是this.year的简写
}
}
public class Main
{
public static void main(String args[])
{
MyDate d=new MyDate(2000,1,1);
d.Show();
}
}
P.S——如何理解C++中的"全局"与"局部"
——全局与局部是标识符的有效范围,或者称作用域。
显然,全局指的是整个程序。全局变量指在整个程序的任何可以写操作命令的位置都可以调用的函数。当然,这样的访问或者调用还要遵守“先定义后使用”规则。
局部是指在程序的某一段范围,范围总是表现为一对花括号之内,常用的范围有全局函数之内.类定义之内.复合语句之内。
C++中,作用域是整个程序的有全局变量和全局函数;函数的局部变量/函数的形式参数/类的成员函数等的作用域都是程序中的某一段范围。
在局部与全局同名时,直接写标识符是局部有效的名字,想要表示全局有效的标识符需要特定的写法。
类的Public成员在整个程序都可以访问,可以视为全局有效的;而private成员只能类的内部访问,是局部有效的。
特别之处,C++的间接访问不受局部限制。只要获得了类的private成员的地址,在类的外部同样可以访问。