static, const, static const 与 const static
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相关推荐
- C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员
文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...
- 深入理解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 ...
- c语言restrict和const,C语言中const、volatile、restrict等类型限定符的区别
auto.register.static.extern是属于存储类修饰符.在声明时,存储类修饰符最多只能使用一个,而且无法用在typeof声明中. 而类型限定符是指const.volatile.res ...
- const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系
前言:很多人都把const int * .int * const.int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性 弄不 清楚,今天特意总结一下,作为学习 ...
- 是否可以从一个static方法内部发出对非static方法的调用?
*问题:是否可以从一个static方法内部发出对非static方法的调用? * * 答:不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后, * 才可以在 ...
- 经过研究发现。c++里面的const意思是说,我是const,成员也是const!!!
class A1{ int i; public : const A1& getA1 () const; }; const A1& A1::getA1 () con ...
- 对于这个函数const int func(const int a) const声明中,三个const分别是什么意思?...
第一个const 函数的返回值类型是const. 这个const修饰没什么意义,你可以想象一下: 既然是函数的 返回值,而且是值传递的形式,是否const有什么意义.如果指针(引用)传递,怎表示返回值 ...
- C++中const引用和非const引用的使用注意
今天学习时突然有疑惑,C++有了指针为何还要设计引用呢?后来看到一篇博客豁然开朗:为什么 C++ 有指针了还要引用? 总结一下: 代码更加简洁好看了 由于引用必须被初始化,并且之后也无法重新绑定其他对 ...
- 【转】C++ const用法 尽可能使用const
http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不 ...
- const char * 和 char const * 和 char * const 区别
我们都用过const 修饰符修饰一个变量,而且我们知道使用const修饰之后,这个变量相当于常量了,他的值在代码其他部分不能再修改,这对于函数调用时候,防止错误的修改原本不应修改的变量起到很大作用,举 ...
最新文章
- 7 个漂亮的 JavaScript 的时间轴组件 [转]
- linux中使用scp远程拷贝文件及文件夹
- 关于选择排序和快速排序--2017-09-24
- java小编程--二分查找和插入排序
- 如何判断两个IP地址是不是处于同一网段?
- mysql中为表创建副本_如何为数据库建立一个副本?
- generating phar.php,Generating
- JVM的方法区和永久带是什么关系?
- C++低级程序设计支持规则
- angularjs路由_AngularJS路由示例– ngRoute,$ routeProvider
- 20151212Jquery 工具函数代码备份
- Java项目:Springboot校园报修管理系统
- rplidar的安装与使用
- 关于总线、现场总线、RS-485和modbus之间的关系
- 局域网组网方案,电信1000M宽带无线WiFi满速方案与排查(随记)
- 蓝凌OA SSRF+JNDI远程命令执行
- 推荐一个不错的国外html5模板网站
- vscode搭建c++开发环境
- 琪琪的果园{青龙面板可跑项目之一}保姆教程
- 34、HTML制做奖多多采购页面(仅供参考)
热门文章
- 计算机网络——常考的面试题
- Oracle 几种更新(Update语句)查询的方法
- Python 3 条件判断和循环语句,list、tuple、dict、set容器,部分函数
- python爬取海量精美高清漂酿纯真可爱善良小姐姐壁纸(老司机福利)
- 云服务器价格比较,用哪家的比较划算?
- Distiller tutorial: Pruning Filters Channels
- mfc函数---CFileDialog的用法
- python twisted安装_图文详解python之twisted模块安装
- Sailfish 浏览器是基于 Gecko 引擎开发
- 最新ncRNA数据库大全(含TCGA、ceRNA、exosome等)