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修饰的变量和成员函数是属于类的,而不是具体某一个对象,整个类的所有对象共用一份static修饰的变量和成员函数。
  • static修饰的变量在类的内部声明,在类的外部定义和初始化,例如:

=>这个是static变量在类TestMain的内部声明:

static const std::string OriginalCfgStr; //声明

=>这个是static变量在类TestMain的外面去定义和初始化:

namespace NdpiTransformersTest{const std::string TestMain::OriginalCfgStr("<timestamped-configuration>\ //定义并出示化}
  • static静态变量,通过类名来访问,作用域为包含这个静态变量的文件中。
  • static静态变量在起作用域之外并没有释放,只是不能访问了
  • 即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
  • static静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,如:double Account::Rate=2.25;static关键字只能用于类定义体内部的声明中,定义时不能标示为static
  • 在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
  • static成员函数主要目的是作为类作用域的全局函数。不能访问类的非静态数据成员。类的静态成员函数没有this指针,这导致:1不能直接存取类的非静态成员变量,调用非静态成员函数;不能被声明为virtual.

const:

  • const 常量出了它的作用域就被释放了
  • const常量在类内部声明,但是定义只能在构造函数的初始化列表中进行
  • const常量的不变性只是针对具体的类某一个对象,类的不同对象间的const常量值是可以不一样的
  • 在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
  • const数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。
  • const 成员函数主要目的是防止成员函数修改对象的内容。即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
  • 关于static、const、static cosnt、const static成员的初始化问题:
#ifdef A_H_
#define A_H_
#include <iostream>
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="<<count<<endl;  cout<<"aa="<<aa<<endl;
}
#endif
void main()
{  A a(10);  A::print();//通过类访问静态成员函数  a.print();//通过对象访问静态成员函数
}  

类的所有实例对象的值都一样可以用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 常量的字面值并没有变化的原因。

  • 在类内部进行 static const 的初始化只能针对于内置类型,比如如下是会报错的:

class A { public: const static string str = "str"; }; const string str;

所以如果不是必要,一般都是采用类外初始化的形式。

  • 类内的 static const 常量的【初始化】必须用常量表达式,也就是说,这里的【初始化】值必须是一个能直接使用的值。所以如果此时要用函数返回值的话,函数应该是 constexpr 的
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行会出现编译错误。

static, const, static const 与 const static相关推荐

  1. C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员

    文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...

  2. 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const

    原文网址:http://www.cnblogs.com/rushuizhijing/archive/2011/08/26/2154737.html 深入理解const char*p,char cons ...

  3. c语言restrict和const,C语言中const、volatile、restrict等类型限定符的区别

    auto.register.static.extern是属于存储类修饰符.在声明时,存储类修饰符最多只能使用一个,而且无法用在typeof声明中. 而类型限定符是指const.volatile.res ...

  4. const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系

    前言:很多人都把const int * .int * const.int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性          弄不 清楚,今天特意总结一下,作为学习 ...

  5. 是否可以从一个static方法内部发出对非static方法的调用?

    *问题:是否可以从一个static方法内部发出对非static方法的调用?  *   * 答:不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,  *         才可以在 ...

  6. 经过研究发现。c++里面的const意思是说,我是const,成员也是const!!!

    class A1{  int i; public :    const  A1&  getA1 () const; };    const A1&  A1::getA1  () con ...

  7. 对于这个函数const int func(const int a) const声明中,三个const分别是什么意思?...

    第一个const 函数的返回值类型是const. 这个const修饰没什么意义,你可以想象一下: 既然是函数的 返回值,而且是值传递的形式,是否const有什么意义.如果指针(引用)传递,怎表示返回值 ...

  8. C++中const引用和非const引用的使用注意

    今天学习时突然有疑惑,C++有了指针为何还要设计引用呢?后来看到一篇博客豁然开朗:为什么 C++ 有指针了还要引用? 总结一下: 代码更加简洁好看了 由于引用必须被初始化,并且之后也无法重新绑定其他对 ...

  9. 【转】C++ const用法 尽可能使用const

    http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不 ...

  10. const char * 和 char const * 和 char * const 区别

    我们都用过const 修饰符修饰一个变量,而且我们知道使用const修饰之后,这个变量相当于常量了,他的值在代码其他部分不能再修改,这对于函数调用时候,防止错误的修改原本不应修改的变量起到很大作用,举 ...

最新文章

  1. 7 个漂亮的 JavaScript 的时间轴组件 [转]
  2. linux中使用scp远程拷贝文件及文件夹
  3. 关于选择排序和快速排序--2017-09-24
  4. java小编程--二分查找和插入排序
  5. 如何判断两个IP地址是不是处于同一网段?
  6. mysql中为表创建副本_如何为数据库建立一个副本?
  7. generating phar.php,Generating
  8. JVM的方法区和永久带是什么关系?
  9. C++低级程序设计支持规则
  10. angularjs路由_AngularJS路由示例– ngRoute,$ routeProvider
  11. 20151212Jquery 工具函数代码备份
  12. Java项目:Springboot校园报修管理系统
  13. rplidar的安装与使用
  14. 关于总线、现场总线、RS-485和modbus之间的关系
  15. 局域网组网方案,电信1000M宽带无线WiFi满速方案与排查(随记)
  16. 蓝凌OA SSRF+JNDI远程命令执行
  17. 推荐一个不错的国外html5模板网站
  18. vscode搭建c++开发环境
  19. 琪琪的果园{青龙面板可跑项目之一}保姆教程
  20. 34、HTML制做奖多多采购页面(仅供参考)

热门文章

  1. 计算机网络——常考的面试题
  2. Oracle 几种更新(Update语句)查询的方法
  3. Python 3 条件判断和循环语句,list、tuple、dict、set容器,部分函数
  4. python爬取海量精美高清漂酿纯真可爱善良小姐姐壁纸(老司机福利)
  5. 云服务器价格比较,用哪家的比较划算?
  6. Distiller tutorial: Pruning Filters Channels
  7. mfc函数---CFileDialog的用法
  8. python twisted安装_图文详解python之twisted模块安装
  9. Sailfish 浏览器是基于 Gecko 引擎开发
  10. 最新ncRNA数据库大全(含TCGA、ceRNA、exosome等)