类的扫描
1.扫描类名
2.扫描类成员
3.返回值 形参 默认值
4.函数体
统计类生成的对象的个数
静态成员的概念:
静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员先于类的声明而存在于内存,也可以根据类声明的对象来访问.而非静态成员必须实例化之后才会分配内存.
非静态成员的概念:
所有没有加static的成员都是非静态成员.而类被实例化后,可以通过实例化的类名进行访问.非静态成员的生存期决定于该类的生存期.而静态成员不存在生产期的问题,因为它始终驻留在内存.
静态成员函数
与普通的成员函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针.从这个意义上来说,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其他的静态成员函数.
static成员变量(不属于对象私有属于对象共享)
1、一定在类外初始化;
2、静态成员变量不属于,属于类作用域;
3、不依赖对象;
能访问静态成员变量,不能访问普通的成员变量。
static成员方法:
1、_cdecl调用约定,没有this指针;
2、不依赖调用;
3、能看见类中所有的成员。
函数指针调动类成员方法的时候,调用成员函数用
.* ->*
在main函数中
int main()
{
Test test1(20);
typedef void (Test::*pFunc1) ();
pFunc1 pfunc1 = &Test :: show;
(test1.*pfunc1)();//调用函数指针(成员函数调用)生成了新的操作符(.*)
Test* ptest = new Test(30);
(ptest->*pfun1)();// 生成->*操作符
return0;
}
class Test
{
public:
Test(int a = 0){ this->ma = a; }
~Test()
{
std::cout << "Test::~Test()" << std::endl;
}
private:
int ma;
};
int main()
{
Test test1(20);
typedef void (Test::*pFunc1) ();
pFunc1 pfunc1 = &Test :: show;
(test1.*pfunc1)();//调用函数指针(成员函数调用)生成了新的操作符(.*)
Test* ptest = new Test(30);
(ptest->*pfun1)();// 生成->*操作符
return0;
}
类类型的返回值
返回值的规则:
1、类类型;
都是由临时量带回去。
2、其他类型;
<=4 eax;
>4 <=8 eax edx;
>8 临时量
class Test
{
public:
Test(int a = 0){ this->ma = a; }
~Test()
{
std::cout << "Test::~Test()" << std::endl;
}
private:
int ma;
};
//①
Test GetValue(Test rhs)
{
Test temp = rhs;
return temp;
}
/*
对象产生:两个
1、形参对象rhs(实参传形参)
2、temp局部对象
*/
//②
Test GetValue(Test&rhs)
{
Test temp = rhs;
return temp;
}
/*两个
1、实参传形参无对象生成
2、temp局部对象
3、返回值临时对象
*/
//③
Test GetValue(Test*prhs)
{
Test temp = *prhs;
return temp;
}
/*两个
1、指针指向实参无对象生成
2、拷贝构造生成temp对象;
3、返回时调用拷贝构造生成临时对象
*/
//④
Test GetValue(Test &rhs )
{
return Test(rhs);
}
/*一个
显式生成临时对象(为了返回值)(生成返回过程中的临时对象)(优化了)
Test (rhs)->return ->Teat temp ;两个优化为一个
*/
//⑤
Test &GetValue(Test&rhs)//实参到形参不生成对象
{
return Test(rhs);
}
//一个
//⑥
Test &GetValue (Test &rhs)
{
Test temp(rhs);
return temp;
}
/*
不能返回局部变量的指向或者引用
*/