我正在尝试学习一些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;
}
Run Code Online (Sandbox Code Playgroud)
你能告诉我这行是做什么的:public:A(int i):m(i){} private:int m?我不认为A是带有int参数i的构造函数,并且m是A类的私有成员,但我无法理解什么是m(i)?这是语法问题吗?
将m(i)在构造函数初始化m值为成员i.
您的示例具有相同的结果(而不是行为)
A(int i) {
m = i;
}
Run Code Online (Sandbox Code Playgroud)
在示例中使用初始化列表初始化成员更有效,因为使用参数直接调用成员的构造函数,i而在上面的示例中,m调用空构造函数然后 m赋值i.
这是一个构造函数初始化列表,它m使用指定的值初始化类的成员.
它可以防止初始化,然后在某些情况下立即分配(不是这里).
某些成员只能在初始化列表中初始化 - const成员,引用成员,不是默认构造的类型.
A(int i) : m(i) {}
^^^^^^ this is called member-initialization list.
Run Code Online (Sandbox Code Playgroud)
这m(i)意味着m正在初始化i.
如果您有更多的成员,比如说x,y在你的类,那么你可以这样写:
A(int i) : m(i), x(i*10), y(i*i) {}
Run Code Online (Sandbox Code Playgroud)
因此,在进入构造函数体之前,所有3个成员都已初始化.
有关详细解答,请参阅以下主题: