子类、父类、构造函数…
发布网友
发布时间:2022-05-20 22:03
我来回答
共6个回答
热心网友
时间:2023-10-03 06:37
":"是在构造函数中直接去调用一个类的构造函数(可以说是定义变量)
因为变量在类是不会被定义的(除了static变量)
变量都是在定义了的类变量对象 在类中定义的变量才会随之定义
所以在调用构造函数的时候 : 后面就是对在类中声明的变量进行定义 并调用相应的构造函数 正因为如此 所以用这样的方式来初始化变量是最有效率的
你可以在类里定义一个变量mother m;
然后son的构造函数这样写 son:m(a){} 这等于你在普通的函数里写 mother m(a) 是一样的效果
热心网友
时间:2023-10-03 06:37
在父类的构造函数有参数的时候子类的构造函数需要在参数列表中标识出来
热心网友
时间:2023-10-03 06:38
因为前面已经有class son : public mother也就是派生类son继承自类mother,所以这里son (int a) : mother (a)是将son类的a值传递给mother类的a。如果基类的构造函数有参数,它派生类的构造函数需要给基类传递参数时就需要这么写。
热心网友
时间:2023-10-03 06:38
如果一个段中的局部变量与一个全局变量同名,而又要用到全局变量,可使用 域操作符 "::"
热心网友
时间:2023-10-03 06:39
这是继承的重要性
派生类(子类)继承于基类(父类)
类的继承可以直接这样写:
class daughter : public mother{}和
class son : public mother {}
首先你先得弄清楚基类中有两个构造函数一个是不带参数的构造函数mother ()
另外一个是带参数的构造函数mother (int a)
现在来看!
而你的问题:“son (int a) : mother (a) ”
可以很清楚的理解:是派生类 son的带参数的构造函数继承基类的带参数的构造函数mother (int a) ;
所以很清楚了!
“:”是用来继承的符号.
热心网友
时间:2023-10-03 06:40
:之后的部分就是所谓的初始化列表,
如果你的类中有 数据成员,或者你的类继承了其父类的数据成员(包括父类的私有和保护),你都可以考虑使用初始化列表来初始化他们。
如果是本类数据成员,你可以像下面那样初始化,譬如:
class Cls
{
public:
Cls():aa(1){}
private:
int aa;
}
如果是从父类继承的数据成员,(虽然本类不可见,但还是存在的),
就可以像楼主所说的son (int a) : mother (a)
这样初始化父类继承下来的数据,不过楼主给的mother类中在加个数据成员就更好啦。
为什么要使用初始化列表而不直接在类中赋值呢?
一方面是由于类的引用成员和常量成员必须要在初始化列表中初始化;
另一方面是由于效率问题。如下代码楼主可以研究研究,一看就应该明白。
class CData
{
public:
CData()
{
cout<<"CData()"<<endl;
}
CData(int i)
{
cout<<"CData(int i)"<<endl;
};
CData(const CData& obj)
{
cout<<"CData(const CData& obj)"<<endl;
}
CData & operator=(const CData& obj)
{
cout<<"CData & operator=(const CData& obj)"<<endl;
return *this;
}
CData & operator=(int i)
{
cout<<"CData & operator=(int i)"<<endl;
return *this;
}
};
class StrPtr
{
public:
StrPtr():a(3)
{
cout<<"StrPtr():a(3)"<<endl;
}
StrPtr(int c)
{
cout<<"StrPtr(int c)"<<endl;
a=3;
}
private:
CData a;
};
int main(int argc, char* argv[])
{
cout<<"无初始化器:"<<endl;
StrPtr str(1);
cout<<"有初始化器:"<<endl;
StrPtr obj;
}
最后,在面向对象中,继承是IS A的关系
儿子可不是一个妈妈哦
^_^