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. VMWare15.0手动为Mac OS10.14虚拟机安装VMWare Tools

    安装完客户机虚拟机后,无法在虚拟机和本机之间拖拽传输文件,开启虚拟机后,底部提示安装VMWare Tools,但是这里无法安装. 虽然可以联网后使用局域网工具(如FeiQ)来传输,但是老感觉不是太方便 ...

  2. Alpha4

    一.站立式会议照片 二.工作进展 (1) 昨天已完成的工作 a. 实现用户登录时获取用户信息功能 b. 实现个人目标列表,允许用户在个人目标界面浏览已设置的目标 c. 继续实现目标广场列表 (2)今天 ...

  3. 【转】WPF 异步执行方法后对 UI 进行更新的几种方法

    使用 async/await 的情况: private async void Button_Click(object sender, RoutedEventArgs e) { (sender as B ...

  4. Spring通过配置类加载实体bean

    以下4个java类都在都一个包下: 1.定义接口 public interface AA { void play(); } 2.定义实体bean //组件注解,表明该类是一个组件 @Component ...

  5. Java JMS——消息服务

    转载请注明原文地址: https://www.cnblogs.com/ygj0930/p/10921569.html 一:什么是Java消息服务—— 消息通信接口规范 Java消息服务指的:两个应用程 ...

  6. Spring Boot Admin 详解(Spring Boot 2.0,基于 Eureka 的实现)

    原文:https://blog.csdn.net/hubo_88/article/details/80671192 Spring Boot Admin 用于监控基于 Spring Boot 的应用,它 ...

  7. Consul 学习资料

    资料 网址 Consul 入门指南 https://book-consul-guide.vnzmi.com/

  8. 排序算法-冒泡排序(Java)

    package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className BubbleSort * @date 20 ...

  9. (9-4 )deepsort在ubuntu1604下配置

    Deep Sort with PyTorch YOLO https://github.com/ZQPei/deep_sort_pytorch 查看python版本 python3 --version ...

  10. 管理node.js的nvm

    我们坑同时在运行2个项目.而2个不同的项目所使用的node版本又不一样,或者是要用更新的node版本进行试验或学习.这种情况下,对于维护多个版本的node将会是一键非常麻烦的事情,而nvm就是为了解决 ...