我正在尝试学习一些OOP,我在理解以下程序时遇到了问题:
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
class A
{
public:
A(int i) : m(i){}
friend class B;
friend void g_afiseaza_m();
private:
int m;
};
class B
{
public:
void afiseaza_m()
{
A a(250);
cout<<"clasa B este prietena cu clasa A"<<endl<<" poate accesa membrul privat A::m"<<endl<<a.m<<endl;
}
};
void g_afiseaza_m()
{
A a(300);
cout<<"functia g_afiseaza_m nu este un membru al clasei A dar este prieten"<<endl<<"poate accesa membrul privat A::m"<<endl<<a.m<<endl;
}
int main()
{
B b;
b.afiseaza_m();
g_afiseaza_m();
getch();
return 0;
}
请告诉我这行是做什么的:public:A(int i):m(i){} private:int m? 我不认为A是带有int参数i的构造函数,并且m是A类的私有成员,但我无法理解什么是m(i)?这是语法问题吗?
答案 0 :(得分:6)
构造函数中的m(i)
初始化值为m
的{{1}}成员。
您的示例与
具有相同的结果(而非行为)i
使用初始化程序列表初始化成员的效率更高,因为使用参数A(int i) {
m = i;
}
直接调用成员的构造函数,而在上面的示例中,调用i
的空构造函数并且然后 m
被赋值m
。
答案 1 :(得分:5)
这是一个构造函数初始化列表,它使用指定的值初始化类的成员m
。
在某些情况下(不在此处),可以防止初始化,然后立即分配。
某些成员只能在初始化列表 - const
成员,引用成员,非默认构造的类型中初始化。
答案 2 :(得分:5)
A(int i) : m(i) {}
^^^^^^ this is called member-initialization list.
此处m(i)
表示正在使用m
初始化i
。
如果您的班级中有更多成员,比如x
,y
,那么您可以写下:
A(int i) : m(i), x(i*10), y(i*i) {}
所以在进入构造函数体之前,所有3个成员都已初始化。
有关更详细的解答,请参阅以下主题: