1. static const/ const static, 意义一样
namespace NdpiTransformersTest
{
class TestMain
{
public: ~TestMain();
static int run(int argc, const char** argv);
private:
static ConfigMgmtDataTypes::Config::Ptr getConfigData(const std::string& configStr);
static std::string formattedXmlString(const std::string str);
static void fromLLtoXml(const char** ll, std::string& xml);
private:
static const std::string OriginalCfgStr;
static const std::string FaultyCfgStr;
};
} // NdpiTransformersTest
PS:
=>这个是static变量在类TestMain的内部声明:
static const std::string OriginalCfgStr; //声明
=>这个是static变量在类TestMain的外面去定义和初始化:
namespace NdpiTransformersTest
{
const std::string TestMain::OriginalCfgStr("\ //定义并出示化
}
const:
class Test
{
public:
Test():a(0){}
enum {size1=100,size2=200};
private:
const int a;//只能在构造函数初始化列表中初始化
static int b;//在类的实现文件中定义并初始化
const static int c;//与 static const int c;相同。
};
int Test::b=0;//static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象。
const int Test::c=0;//注意:给静态成员变量赋值时,不需要加static修饰符。但要加const
#ifdef A_H_
#define A_H_
#include
using namespace std;
class A
{
public:
A(int a);
static void print();//静态成员函数
private:
static int aa;//静态数据成员的声明
static const int count;//常量静态数据成员(可以在构造函数中初始化)
const int bb;//常量数据成员
};
int A::aa=0;//静态成员的定义+初始化
const int A::count=25;//静态常量成员定义+初始化
A::A(int a):bb(a)//常量成员的初始化
{
aa+=1;
}
void A::print()
{
cout<<"count="<
类的所有实例对象的值都一样可以用static const(const static)
class A {
public:
const static int num2 = 13; // 声明和【初始化】
};
// const int A::num2;
int main(int argc, char const *argv[])
{
cout << &(A::num2) << endl; //有编译错误,cout << A::num2 << endl;可以成功
return 0;
}
也就是说 num2 还没有定义。在取消注释后成功输出 num2 的地址。说明在 加上 const int A::num2; 后 num2 才被定义。
那为什么 num2 还没定义就可以使用了呢,其实因为 num2 是 const 常量,在生成汇编代码的时候并不是在 num2 的地址内取值,而是直接将 num2 【初始化】的时候的那个值替换掉 num2。这也就是用指针改变 const 常量的值的时候 const 常量的字面值并没有变化的原因。
class A { public: const static string str = "str"; }; const string str;
所以如果不是必要,一般都是采用类外初始化的形式。
constexpr int fun() {
return 12;
}
class A {
public:
const static int num = fun();
};
const int A::num;
PS:
public对于所有的类都能访问;private只能类内部自己用,继承的子类和friend类也不能用;protected是自己和子类都能用,friend类也能使用;
const Filename getFilename() const;
前边的const表示是返回值是const, 后边的const表示这个函数是const的
explicit:
声明为explicit的构造函数不能在隐式转换中使用。
explicit构造函数是用来防止隐式转换的。请看下面的代码:
class Test1
{
public:
Test1(int n)
{
num=n;
}//普通构造函数
private:
int num;
};
class Test2
{
public:
explicit Test2(int n)
{
num=n;
}//explicit(显式)构造函数
private:
int num;
};
int main()
{
Test1 t1=12;//隐式调用其构造函数,成功
Test2 t2=12;//编译错误,不能隐式调用其构造函数
Test2 t2(12);//显式调用成功
return 0;
}
普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用。Test1的构造函数带一个int型的参数,代码23行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码24行会出现编译错误。