【C++】三大易混概念之隐藏

隐藏:字面意思,把人或者物藏起来,不让人发现,就是隐藏。程序中的隐藏也差不多,只不过不同的是,子类重定义父类。父类中的还是存在的。

  • 隐藏的概念
    隐藏:不同作用域中(父类与子类),函数名或者变量名相同,但是不构成重写(虚函数),则全是隐藏(重定义)。
  • 隐藏的范围
    范围:隐藏不止是成员函数,也可以是成员变量,相同的成员变量就是重定义。
  • 隐藏的效果
    无论在子类的内部或者外部,通过子类对象访问该成员函数或变量,都是访问子类中的同名成员函数或变量。

下面看一个例子:
初始化列表:默认传值,这个值在你没有调用有参构造函数时,会自动给程序赋值。
初始化列表好处是提高了效率。因为初始化列表在程序启动就开始初始化。
初始化列表的适用情况:
1.当类中存在引用时,适用初始化列表(引用虽然可以赋值,但是,初始化效率高)
2.当类中存在常量时(const),适用初始化列表(常量一般都是初始化,不能赋值)

#include <iostream>
using namespace std;

class Cain
{
public:
	Cain():age(3) {};//初始化列表
	Cain(int age){this->age= age;}; //必须写完整,即使里面什么都不做,不然会报无法引用的外部符号,测试的时候,给我差点搞懵了
			 //发现了这个问题,希望你们不要忘记初始化这个构造函数和析构函数。
	void test()
	{
		cout << "This is BaseType test function" << endl;
	}
	~Cain(){};
//测试变量名
public:
	int age; //测试为了简单,我用public,但是一般是隐藏类型实现,给一个public方法return这个值。
};

//子类与上面一样写一套儿
class Son
{
public:
	Son():age(49){};
	Son(int age){this->age = age;};
	void test()
	{
		cout << "This is ChildType test function" << endl;
	}
	~Son(){};
public:
	int age; //测试不要为难自己,简单点,能说明问题就行了。
};

//测试函数
//测试成员函数:
void Demo()
{
	Cain c;
	c.test(); //result:This is BaseType test function;
	Son s;
	s.test(); //result: This is ChildType test function; 执行到这里,子类就隐藏了父类的相同成员函数。
}

//测试成员变量
void Demo1()
{
	Cain c;
	cout << c.age<< endl; //result: 3;
	Cain c1(5);
	cout << c1.age << endl; //result: 5;

	Son s;
	cout << s.a << endl; //result: 49;
	Son s1(20);
	cout << s1.a <<endl; //result: 20;
}

int main()
{
	Demo();
	Demo1();

	system("pause");
	return 0;
}

到此,C++三大易混淆的知识点便是简单梳理完了。可能不是那么全面,但是也算是说到了一些点上,知识都是辅补的,聚而得一,始为精。

转载请注明出处,谢谢!

猜你喜欢

转载自blog.csdn.net/m0_43458204/article/details/106611624