‘init‘:member function definition looks like a ctor(构造函数的缩写)
具体编译的错误提示如下:
warning C4183: ‘init‘: member function definition looks like a ctor, but name does not match enclosing class
warning C4183: ‘method‘: member function definition looks like a ctor, but name does not match enclosing class
Linking...
main.exe - 0 error(s), 2 warning(s)
意思:成员函数像是一个构造函数ctor,但成员函数的名字又与类名不匹配
/////////////////////////////////////代码如下:
#include<iostream>
using namespace std;
class A
{
public:
A(){ cout<<"A()"<<endl; init();}
// ~A(){cout<<"~A()"<<endl;}
virtual ~A(){cout<<"~A()"<<endl;}
virtual init(){cout<<"A::init()"<<endl;}
virtual method(){cout<<"A::method()"<<endl;}
};
class B:public A
{
public:
B()
{
cout<<"B()"<<endl;
}
~B(){cout<<"~B()"<<endl;}
init(){cout<<"B::init()"<<endl;}
method(){cout<<"B::method()"<<endl;}
};
int main()
{
A* p;
p=new B();
p->method();
delete p;//导致内存泄露
return 0;
}
//从上面红色字体的成员函数可以看出,函数没有返回类型,也就像是写了一个析构函数,但是却没有和类名相匹配。
正确的代码如下:
#include<iostream>
using namespace std;
class A
{
public:
A(){ cout<<"A()"<<endl; init();}
// ~A(){cout<<"~A()"<<endl;}
virtual ~A(){cout<<"~A()"<<endl;}
virtual void init(){cout<<"A::init()"<<endl;}
virtual void method(){cout<<"A::method()"<<endl;}
};
class B:public A
{
public:
B()
{
cout<<"B()"<<endl;
}
~B(){cout<<"~B()"<<endl;}
void init(){cout<<"B::init()"<<endl;}
void method(){cout<<"B::method()"<<endl;}
};
int main()
{
A* p;
p=new B();
p->method();
delete p;//如果不删除对象指针,会导致内存泄露,无法调用析构函数
return 0;
}
其中温习一个要点:虚析构函数的使用
构造函数初始化程序(const变量的特殊优待(初始化列表)
在如下类定义中:
class C
{
public:
C(){
x=0; // OK, x is not const
c=0; //ERROR ,c is const
}
private:
int x;
const int c;
};
类C的构造函数通过赋值语句对该类的两个数据成员进行初始化。但由于数据成员c是const类型的,因此对其做出的赋值操作是非法的。只要为构造函数添加一个初始化列表(constructor initializer)就可以解决问题
修改后:
C( ):c(0) {x=0;}
结论:初始化const类型数据成员的唯一方法:初始化表。