1,this指针
什么是this指针,简单说就是当前 对象本身。比如:程序1 如程序1所示运行结果得到两个相同的地址,即this指向当前对象的起始地址,通过this可得到对象的各种属性。
程序1
class A
{
public :
A(int a=0):i(a){}
void test()
{
cout<<this <<endl;//this指向当前实例化的对象
}
private:
int i;
};
int main()
{
A a;
cout<<&a <<endl;
a.test();
getchar();
return 0;
}
2,const函数
为什么要在函数的结尾添加一个const,原因是为了防止该函数修改当前对象的属性。如在程序1再修改函数 test() 程序2,如程序所示将test声明为const后再++i,此时将出现编译错误,原因是你的任意一个函数声明都有一个隐式的this指针,这个参数不可见是编译器自动添加上去的 而 void test()const 相当于void test(const A *this) *this即是当前对象,声明为const则不可改变当前对象的属性 。
程序2
class A
{
public :
A(int a=0):i(a){}
void test()const //相当于void test(const A *this)
{
++i; //error 声明为const 的函数不可修改当前对象的属性
cout<<this <<endl;//this指向当前实例化的对象
}
const int& test1()
{
return i;
}
private:
int i;
};
如果在前面加上const会出现什么情况呢?这是const会修饰返回值,如程序2 如果有语句 a.test1()=2;此时将出项编译错误,提示不能访问const变量。即前面加上const用来防止修改该函数的返回值。
注:const修饰符还是重载的标志。
3,赋值操作符的重载
为什么赋值操作符重载函数要返回当前对象的引用,原因是要使自定义类型和内置类型有一样的行为,如int a,b,c ; a=b=c;内置类型可以有这样的操作,同样的类类型也应有这样的操作,如程序3,但C++并没有规定一定要返回引用,注意即使返回的不是引用 a=b=c这样的操作也可以完成,应为返回值是一个临时对象此时用临时对象也可完成此操作,但如果是这样的 (a=b)=c 非引用函数无法完成此操作,原因首先进行a=b计算完成后产生一个临时对象,再用c给一个临时对象赋值没有意义,假如是引用则a=b返回a的引用,再用c给a赋值此时此时合法的。
程序3
class A
{
public :
A(int a=0):i(a){}
void test()const
{
++i; //error 声明为const 的函数不可修改当前对象的属性
cout<<this <<endl;//this指向当前实例化的对象
}
const int& test1()
{
return i;
}
A& operator=(const A &a)
{
if(this==&a)
return *this;
i=a.i;
return *this;
}
private:
int i;
};