友元:通过定义友元类和友元函数可以用来访问类的私有成员变量
一个类的成员函数可以使里一个类的友元(包括析构函数和构造函数)
类与类之间的友元关系是不能传递的.例如B是A的友元, C是B的友元,不能说C是B的友元。
this指针:
this指向某个成员函数所作用的的对象。
产生的原因是因为c++源码转换为C进行编译,对应的类的成员函数将会转换为全局函数,并为这个全局函数增加一个
指向这个成员函数所作用的对象的this指针。通过这个this指针访问这个成员函数所作用的类的对象。
譬如
class A{
int i;
public:
func(){ func(A *this){
cout<<i<<"Hello world"<<endl;-----> cout<<this->i<<"Hello world"<<endl;
} }
}
int main()
{
A *a=new A;
a->func();--------------------->fun(a);
}
但是
class A{
int i;
public:
func(){ func(A *this){
cout<<"Hello world"<<endl;-----> cout<<"Hello world"<<endl;
} }
}
int main()
{
A *a=NULL;
a->func();--------------------->fun(a);
}
不会出错因为这样没有访问成员变量,只是函数调用。
另外static成员变量和函数由于它相当与是一个全局的变量和函数并不具体作用于某一个类所以没有this指针,所以
在static函数中访问非静态成员对象是有问题。
常量对象,常量成员函数和常引用:
常量对象:在对象前加const关键字,是的对象的值不会被改变。
常量成员函数:在类的成员数后加上一个const关键字,成为所谓的常量成员函数。常量成员函数在执行的期间不应该修改它所作用的对象。
因此,在常量成员函数中不应该修改成员变量的值(静态变量除外),同时已不能调用非常量成员函数这是因为非常量成员函数有可能会修改
作用对象的成员(static成员函数除外)。作用与对象的成员变量和函数通过this指针来获取的,原理如上。由于静态成员变量和函数是一个全局
的函数和变量不具体作用于某个对象,所以在常量成员函数中可以修改静态成员变量调用静态成员函数。
另外常量成员函数的重载
void func () const{}
void func(){}
这两个函数并不是重定义而是函数的重载。
常量对象会调用对象的常量重载的常量成员函数而非常量对象则会调用非常量成员函数。
而且常量成员对象不能调用非常量成员 函数这是因为某个非常量成员函数和修改对象的成员变量。
常引用;:常作为函数的参数传递给函数来避免在函数中修改变量,同时减少构建临时对象的代价。
一个类的成员函数可以使里一个类的友元(包括析构函数和构造函数)
类与类之间的友元关系是不能传递的.例如B是A的友元, C是B的友元,不能说C是B的友元。
this指针:
this指向某个成员函数所作用的的对象。
产生的原因是因为c++源码转换为C进行编译,对应的类的成员函数将会转换为全局函数,并为这个全局函数增加一个
指向这个成员函数所作用的对象的this指针。通过这个this指针访问这个成员函数所作用的类的对象。
譬如
class A{
int i;
public:
func(){ func(A *this){
cout<<i<<"Hello world"<<endl;-----> cout<<this->i<<"Hello world"<<endl;
} }
}
int main()
{
A *a=new A;
a->func();--------------------->fun(a);
}
但是
class A{
int i;
public:
func(){ func(A *this){
cout<<"Hello world"<<endl;-----> cout<<"Hello world"<<endl;
} }
}
int main()
{
A *a=NULL;
a->func();--------------------->fun(a);
}
不会出错因为这样没有访问成员变量,只是函数调用。
另外static成员变量和函数由于它相当与是一个全局的变量和函数并不具体作用于某一个类所以没有this指针,所以
在static函数中访问非静态成员对象是有问题。
常量对象,常量成员函数和常引用:
常量对象:在对象前加const关键字,是的对象的值不会被改变。
常量成员函数:在类的成员数后加上一个const关键字,成为所谓的常量成员函数。常量成员函数在执行的期间不应该修改它所作用的对象。
因此,在常量成员函数中不应该修改成员变量的值(静态变量除外),同时已不能调用非常量成员函数这是因为非常量成员函数有可能会修改
作用对象的成员(static成员函数除外)。作用与对象的成员变量和函数通过this指针来获取的,原理如上。由于静态成员变量和函数是一个全局
的函数和变量不具体作用于某个对象,所以在常量成员函数中可以修改静态成员变量调用静态成员函数。
另外常量成员函数的重载
void func () const{}
void func(){}
这两个函数并不是重定义而是函数的重载。
常量对象会调用对象的常量重载的常量成员函数而非常量对象则会调用非常量成员函数。
而且常量成员对象不能调用非常量成员 函数这是因为某个非常量成员函数和修改对象的成员变量。
常引用;:常作为函数的参数传递给函数来避免在函数中修改变量,同时减少构建临时对象的代价。