1.const指针
int a = 10, b = 20;
int* p1 = &a;
const int* p2 = &a;
int const* p3 = &a;
int* const p4 = &a;
const int* const p5 = &a;
int a = 10, b = 20;
const int* p = &a;
int* s0 = p;
const int* s1 = p;
int* const s2 = p;
const int* const s3 = p;
int a = 10, b = 20;
int* const p = &a;
int* s0 = p;
const int* s1 = p;
int* const s2 = p;
const int* const s3 = p;
2.this指针 (1)上图的系统为每一个对象分配了全套的内存,包括安放成员数据的数据区和安放成员函数的代码区。但是区别同一个类所实例化的对象,是由属性(数据成员)的值决定,不同对象的数据成员的内容是不一样的;而行为(操作)是用函数来描述的,这些操作的代码对所有的对象都是一样的。 (2)编译器对类型的编译:① 对类型进行编译过程中首先是别数据成员,将属性成员记录 ② 函数原型识别 ③ 改写:将成员函数进行改写时候在参数列表里面加上this指针,成员函数函数声明的参数列表加this指针,属性名称一样的记得要加this指针,设计类型,设计成员函数。 (3)所有this指针前面系统都加了const,函数调动之后,this指针消失,this指针在成员函数里面,不在对象里面,常对象只能调动常方法,普通对象既能调动普通方法,也能调动常方法 (4)函数调用约定:this调用 this指针存放于ecx,this指针地址存放于ecx,到达函数内部,把ecx的值存放于this指针 _cdecl是c和c++程序的缺省方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用stdcall函数的大。函数采用从右到左的压栈方式。vc将函数编译后会在函数名前面加上下划线前缀,是mfc缺省调用约定。 fastcall调用约定是“人如其名”,它的主要特点就是快,因为它是通过寄存器来传送参数的。 thiscall仅应用于”c++"成员函数。this指针存放于ecx寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定 3.构造函数和析构函数 3.1构造函数 (1)构造函数:数据成员多为私有的,要对它们进行初始化,必须用一个共有函数来进行。同时这个函数应该在且在定义对象时自动执行一次,称为构造函数。 (2)构造函数用途:① 创建对象 ② 初始化对象中的属性 ③类型转换 (3)构造函数的定义与使用 构造函数是特殊的公有成员函数(在特殊用途中构造函数的访问限定可以定义成私有或保护) ,其特征如下: ① 函数名与类名相同。 ② 构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可写void。实际上构造函数有返回值,返回的就是构造函数所创建的对象。 ③ 在程序运行时,当新的对象被建立,该对象所属的类构造函数自动被调用,在该对象生存期中也只调用这一次。(系统内调动,调动一次) ④ 构造函数可以重载。严格地讲,类中可以定义多个构造函数,它们由不同的参数表区分系统在自动调用时按一般函数重载的规则选一个执行。 ⑤ 构造函数可以在类中定义,也可以在类中声明,在类外定义。 ⑥ 如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数: 类名(void){ } 但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。只要构造函数是无参的或者只要各参数均有缺省值的,C++编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个,对象不能调动构造函数。 空间:系统分配产生,有空间不一定有对象,空间是由于调用构造函数构建对象。 3.2析构函数 (1)定义:当定义一个对象时,C++ 自动调用构造函数建立该对象并进行初始化,那么当一个对象的生命周期结束时,C++也会自动调用一个函数注销该对象并进行善后工作,这个特殊的成员函数即析构函数(destructor) : (1)构函数名与类名相同,但在前面加上字符~。如: ~CGoods ()。 (2)析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数。 (3)一个类有一个也只有一个析构函数,这与构造函数不同。 (4)对象注销时,系统自动调用析构函数。 (5)如果类说明中没有给出析构函数,则C+ +编译器自动给出一个缺省的析构函数。如: ~类名 (){}
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Pointer
{
private:
int row;
int col;
public:
Pointer(int r,int c)
{
row=r;
col=c;
}
~Pointer()
{
cout<<"~Pointer"<<endl;
}
};
Pointer g_pt(12,23);
int main()
{
Pointer p1(100,200);
Pointer* p=NULL;
p=new Pointer(10,20);
Pointer* s=(Pointer*)malloc(sizeof(Pointer));
}
class Object
{
private:
int val;
public:
Object(int x)
{
val=x;
cout<<"Create"<<val<<endl;
}
};
Object ObjA(1);
int main()
{
Object ObjB(2);
}
Object ObjC(3);
|