【C++】类和对象(类生成对象的个数及类类型的返回值)

 类的扫描
        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;
}
/*
不能返回局部变量的指向或者引用
*/

猜你喜欢

转载自blog.csdn.net/like_that/article/details/89056751
今日推荐