博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】C++ 类中的static,const,及引用类型的初始化
阅读量:5327 次
发布时间:2019-06-14

本文共 2476 字,大约阅读时间需要 8 分钟。

文档主要来自:http://blog.csdn.net/yjkwf/article/details/6067267

1. static类型

  1. 用static可以为类类型的所有对象所共有,像是全局对象,但又被约束在类类型的名字空间中。static定义的静态常量在函数执行后不会释放其存储空间。
  2. 可以实施封装,将其放在private或protected区域中。
  3. static成员没有this指针,它不是任何一个对象的组成部分,推荐用“类名::static成员名调用”。
  4. static成员函数声明时应写明static关键字,在定义时不能加static关键字。
  5. static数据成员声明时应写明static关键字,在定义时不能加static关键字。
  6. static成员函数不能使用const以修饰其不改变成员属性。
  7. static成员函数不能使用virtual以修饰其虚拟性。
  8. static const数据成员可以在类中声明并且初始化,然后在类定义之外再次进行定义;或者在类中声明,但在类定义外进行定义。非const的static数据成员仅能在类中声明,并在类定义之外进行定义。
  9. static成员函数主要目的是作为类作用域的全局函数。不能访问类的非静态数据成员。类的静态成员函数没有this指针,这导致:1、不能直接存取类的非静态成员变量,调用非静态成员函数2、不能被声明为virtual

2. const类型

  1. const定义的常量在超出其作用域之后其空间会被释放,const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。
  2. const数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt。
  3. cosnt成员函数主要目的是防止成员函数修改对象的内容。即const成员函数不能修改成员变量的值,但可以访问成员变量。当方法成员函数时,该函数只能是const成员函数。

3. 引用类型

  1. 引用不能为 NULL
  2. 引用永远合法
  3. 引用的指向只能初始化,不能修改其指向,但可修改其指向的变量的值
  4. 引用不是变量,本身并不占用任何存储空间

4. static 、 const及引用类型的类属性的声明及定义

#include 
using namespace std; class A { public: A(int a);    A(); static void print();//静态成员函数 private: static int aa;//静态数据成员的声明     //static int cc = 1; //不允许在类中定义非const型的static变量,编译出错 static const int count;//常量静态数据成员 const int bb;//常量数据成员   static const int count1 = 1; //常量静态数据成员(在类中定义,但必须在类定义外再次定义)}; int A::aa=0;//静态成员的定义const int A::count=25;//静态常量成员定义const int A::count1; //已在类中进行定义,此处还需再次定义,但可不赋值//非静态的const成员需在初始化列表中进行初始化A::A():bb(0){ //大括号不可省略,否则编译出错}A::A(int a):bb(a)//常量成员的初始化 { aa+=1; } //静态成员函数仅能访问静态的成员变量,不可访问非静态成员变量void A::print() { cout << "count = " << count << endl; cout << "count1 = " << count1 << endl; cout << "aa = " << aa << endl; } class B{public:  B(int &var);  void modify_g(int &var);  int get_g();private:  int &g;};//因为引用类型的变量不可为空,所以必须使用参数来对引用类型变量进行初始化。默认构造函数也就不可初始化引用类型变量了B::B(int &var):g(var){}void B::modify_g(int &var){  g = var;}int B::get_g(){  return g;}//为保证C++文件的可移植,main的正确写法只有两种:int main()或int main(int argc, char *argv[])int main() { A a(10); A::print();//通过类访问静态成员函数 a.print();//通过对象访问静态成员函数      A a1;    A::print();    a1.print();    int var = 2;    B b(var);    cout << "b.g = " << b.get_g() << endl;    b.modify_g(10);    cout << "b.g = " << b.get_g() << endl;    cout << "var = " << var << endl; //此时var的值由2变为10        return 0;}

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/sunada2005/p/3394765.html

你可能感兴趣的文章
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
使用命令创建数据库和表
查看>>
【转】redo与undo
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
标识符
查看>>
内存地址对齐
查看>>
创新课程管理系统数据库设计心得
查看>>
Could not resolve view with name '***' in servlet with name 'dispatcher'
查看>>
[转载] redis 的两种持久化方式及原理
查看>>
MyBaits学习
查看>>
管道,数据共享,进程池
查看>>
[Cypress] Stub a Post Request for Successful Form Submission with Cypress
查看>>
SDUTOJ3754_黑白棋(纯模拟)
查看>>
php中的isset和empty的用法区别
查看>>
把word文档中的所有图片导出
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>