1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间

void f1()
{
const int x=1;
cout<<x<<endl;
}
void f2()
{
static int y=2;
cout<<y<<endl;
y++;
}
int main()
{
f1();//1
f1();//1 const定义的常量在超出其作用域之后其空间会被释放
f2();//2
f2();//3 static定义的静态常量在函数执行后不会释放其存储空间
}

2)static静态成员变量不能在类的内部初始化,在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,比如:double Account::Rate = 2.25,static关键字只能用于类定义体内部的声明中,并且在外部定义时不能标识为static

class A
{
private: static int x;//static成员变量只能在内部声明,定义需要放在类的外部 public:
void f()
{
cout<<x<<endl;
}
}; //error 外部定义时不能标识为static
//static int A::x=10; int A::x=10;//在类的外部定义该static成员变量 int main()
{
A a;
a.f();//10
}

3)static表示的是静态的,类的静态成员函数,静态成员变量是和类相关的,而不是和类的具体对象相关的,即使没有具体对象,也能调用类的静态成员函数和静态成员变量。一般类的静态成员函数就相当于一个全局函数,只不过它的作用域限定于包含它的文件中

class A
{
public:
static int x;
static void test()
{
cout<<"test"<<endl;
}
void f()
{
cout<<x<<endl;
}
}; int A::x=10; int main()
{
//即使没有具体对象,也能调用类的静态成员函数和静态成员变量
cout<<A::x<<endl;//10
A::test();//test A a1;
a1.f();//10 A a2;
a2.f();//10 类的静态成员变量和对象无关,只和类有关
}

4)const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数

const成员变量只在某个对象生存期内是常量,而对于整个类而言却可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同,所以不能在类的声明中初始化const数据成员,因为类的对象没有被创建时,编译器不知道const数据成员的值是什么

class A
{
private:
//const int x=1;
//const int y=2; //错误的做法:在这里初始化虽然语义可以通过,但是还是会被构造函数中的值覆盖
const int x;
const int y;
public:
void f()
{
cout<<x<<" "<<y<<endl;
} A(int a,int b):x(a),y(b)//通过构造函数初始化列表来初始化const成员变量,而且必须要有构造函数
{ }; }; int main()
{
A a1(10,20);
a1.f();//10 20 A a2(11,21);
a2.f();//11 21
}

6)const数据成员的初始化只能在类的构造函数的初始化列表中进行,要想建立在整个类中都恒定的常量,应该用类中的枚举常量实现,或者static const

class A
{
private:
const int x;
const int y;
public:
void f()
{
cout<<x<<" "<<y<<endl;
}
enum{x1=100,y1=200}; A(int a,int b):x(x1),y(y1)//通过枚举常量进行恒定初始化,传入的a和b根本没有用到
{ };
}; int main()
{
A a1(10,20);
a1.f();//100 200 A a2(11,21);
a2.f();//100 200
}
class A
{
private:
const int x;
const int y;
public:
void f()
{
cout<<x<<" "<<y<<endl;
}
static int x2,y2; A(int a,int b):x(x2),y(y2)//通过static成员变量进行恒定初始化,传入的a和b也没有起到作用
{ };
}; int A::x2=300;
int A::y2=400; int main()
{
A a1(10,20);
a1.f();//300 400 A a2(11,21);
a2.f();//300 400
}

7)const成员函数的主要目的是防止成员函数修改对象内容,即const成员函数不能修改成员变量的值,但是可以访问成员变量

class A
{
private:
int x=2;
public:
int p() const
{
//x=3;//error const成员函数不能修改成员变量
return x;//但是可以访问成员变量
}
void f()
{
cout<<x<<endl;
} }; int main()
{
A a1;
cout<<a1.p()<<endl;//2
a1.f();//2
}

8)static成员函数的主要目的是作为类作用域的全局函数,不能访问类的非静态数据成员,因为类的静态成员函数没有this指针,这导致:1.不能直接存取类的非静态成员变量,调用非静态成员函数,2.不能被声明为虚函数(没有this指针,实现不了多态,定义为虚函数没有意义)

class A
{
public:
int x=2;
void f()
{
cout<<x<<endl;
}
static int p()
{
int k=3;
// k=x; //error 不能直接存取非静态成员变量
// f(); //error 不能直接调用非静态成员函数
return k;
}
}; int main()
{
A a1;
cout<<a1.p()<<endl;//3
a1.f();//2
}

9)类的const static或static const成员变量必须在哪里初始化?

必须在类的外部进行定义初始化

class A
{
private:
static const int x;
const static int y;//哪个关键字在前无所谓,x和y的含义是相同的
public:
void f()
{
cout<<x<<" "<<y<<endl;
} }; const int A::x=300;//不能加static关键字,但是必须加const关键字
const int A::y=400; int main()
{
A a1;
a1.f();//300 400 A a2;
a2.f();//300 400
}

【C++】const,static和static const类型成员变量声明及其初始化的更多相关文章

  1. C++ static、const和static const类型成员变量声明以及初始化

    C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...

  2. C++11类内static成员变量声明与定义

    众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因 ...

  3. c++ string类型成员变量在调用构造函数后未能正确赋值

    struct RelItem{ string segName; Elf32_Rel* rel; string relName; RelItem(string seg, int addr, string ...

  4. Effective C++:条款22:将成员变量声明为private

    (一)为什么不採用public成员变量 (1)首先,从语法一致性考虑,客户唯一能訪问对象的方法就是通过成员函数,客户不必考虑是否该记住使用小括号(). (2)其次,使用函数能够让我们对成员变量的处理有 ...

  5. Effective C++ -----条款22:将成员变量声明为private

    切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. protected并不比public更具有封装性.

  6. 【22】将成员变量声明为private

    1.为什么要将成员变量声明为private,语法一致性,只通过方法暴露接口. 2.使用方法,可以对成员变量更精确的控制.比如:为所有可能的实现提供弹性,不同实现可以替换:控制可读可写:验证约束条件:处 ...

  7. 条款22:将成员变量声明为private

    protected成员变量的封装性并非高于public变量. 如果有个public的成员变量,一旦其需要改变,那么所有使用它的代码都需要改变. 如果有个protected的成员变量,一点其需要改变,那 ...

  8. 条款22:将成员变量声明为private(Declare data members private)

    NOTE: 1.切记将成员变量声明为private.这可赋予客户访问数据的一致性 可细微划分访问控制 允诺约束条件获得保证,并提供class作者以充分的实现弹性. 2.protected 并不比pub ...

  9. Java中在实例化一个类时,这个类中没有初始值的int类型成员变量i,i的值是不是0?

    java中有两种类型一种是数值性,另一种是类变量数值性变量的初始值为0,类变量的初始化为null没做初始化成员变量int性变量是0, 在java中有这么一条规则,声明在方法中的变量在使用时必须要初始化 ...

随机推荐

  1. Ivanti的垃圾软件landesk

    landesk是Ivanti公司推出的终端管理工具,这个工具垃圾就垃圾在无法卸载,进程杀不死.文件删不掉,奉劝大家千万不要安装这个软件.前些天公司的IT部门一直在催促员工安装这个软件,我一时糊涂安装了 ...

  2. git远程写协作同步

    1:创建一个要提交的文件2 git init 初始化 3 git remote add origin https://github.com/maohongli/cang.git 建立远程连接4 git ...

  3. Android源码分析(十七)----init.rc文件添加脚本代码

    一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...

  4. 微信小程序-获取当前位置和城市名

    微信小程序-获取当前城市位置 1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting: 2,微信的getLocation接口,获取当前用户的地理位置(微信返回的是经纬度,速度等参数) ...

  5. CentOS6.7编译安装mysql5.6

    可能因为有各种情况,无法通过yum安装mysql,这里记录一下编译安装的简单步骤 使用yum安装一些依赖 yum -y install make gcc-c++ cmake bison-devel  ...

  6. 简单理解EM算法Expectation Maximization

    1.EM算法概念 EM 算法,全称 Expectation Maximization Algorithm.期望最大算法是一种迭代算法,用于含有隐变量(Hidden Variable)的概率参数模型的最 ...

  7. 201871010102-常龙龙《面向对象程序设计(java)》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  8. 【洛谷P3835】 【模板】可持久化平衡树

    可持久化非旋转treap,真的是又好写又好调 ~ code: #include <cstdio> #include <cstdlib> #include <algorit ...

  9. Windows WoW64浅析

    WOW64(Windows-On-Windows 64bit)是X64 Windows操作系统的一个子系统,为32位应用程序提供运行环境.类似的还有WOW32子系统,负责在32位Windows系统上运 ...

  10. 剑指offer 6:链表(从头到尾打印链表)

    链表的数据结构 struct ListNode { int value; ListNode* next; }; 那么在链表的末尾添加一个节点的代码如下: void insert(ListNode** ...