Pet*_*etr 6 c++ variables scope declare
让我们有一个C++对象A.它的子代可以访问A中的两个变量(VAR1和VAR2).对象B扩展A并具有一个私有变量VAR3,它还可以访问VAR1和VAR2.A/B的每个实例都有自己的变量.
这是否是声明和定义变量的正确方法?
啊
class A {
protected:
static std::string const VAR1;
static std::string VAR2;
};
Run Code Online (Sandbox Code Playgroud)
A.cpp
#include "A.h"
using namespace std;
string const A::VAR1 = "blah";
string A::VAR2;
Run Code Online (Sandbox Code Playgroud)
BH
#include "A.h"
class B : public A {
private:
static std::string VAR3;
public:
B(std::string const v1, std::string const v2);
void m() const;
};
Run Code Online (Sandbox Code Playgroud)
B.cpp
#include "B.h"
using namespace std;
string B::VAR3;
B::B(string const v1, string const v2) {
VAR2 = v1;
VAR3 = v2;
}
void B::m() const {
// Print VAR1, VAR2 and VAR3.
}
Run Code Online (Sandbox Code Playgroud)
A/B 的每个实例都有自己的变量。
这是声明和定义变量的正确方法吗?
不。您已将A的成员声明为,static这意味着它们是类变量,而不是实例变量。每个实例都没有自己的副本。相反,它们都共享同一个实例。
则使非static:
class A {
protected:
std::string const VAR1;
std::string VAR2;
};
Run Code Online (Sandbox Code Playgroud)
...然后,当然,您不需要全局初始化程序,因此摆脱它:
string const A::VAR1 = "blah";
string A::VAR2;
Run Code Online (Sandbox Code Playgroud)
...如果您希望VAR1每次A实例化时都有一个默认值,那么您可以在类的初始值设定项列表中执行此操作(或者在构造函数主体中,如果您是朋克:)):
A::A() : VAR1("blah") {};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |