隐藏:字面意思,把人或者物藏起来,不让人发现,就是隐藏。程序中的隐藏也差不多,只不过不同的是,子类重定义父类。父类中的还是存在的。
- 隐藏的概念
隐藏:不同作用域中(父类与子类),函数名或者变量名相同,但是不构成重写(虚函数),则全是隐藏(重定义)。 - 隐藏的范围
范围:隐藏不止是成员函数,也可以是成员变量,相同的成员变量就是重定义。 - 隐藏的效果
无论在子类的内部或者外部,通过子类对象访问该成员函数或变量,都是访问子类中的同名成员函数或变量。
下面看一个例子:
初始化列表:默认传值,这个值在你没有调用有参构造函数时,会自动给程序赋值。
初始化列表好处是提高了效率。因为初始化列表在程序启动就开始初始化。
初始化列表的适用情况:
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++三大易混淆的知识点便是简单梳理完了。可能不是那么全面,但是也算是说到了一些点上,知识都是辅补的,聚而得一,始为精。
转载请注明出处,谢谢!