static成员函数不能被声明为const virtual volatile 原因
来源:互联网 发布:使命召唤emp知乎 编辑:程序博客网 时间:2024/06/03 04:28
1.virtual与静态函数C++中,静态成员函数不能被声明为virtual函数。例如,下面的程序会编译失败。#include<iostream>class Test{ public: // 编译错误:static成员函数不能声明为virtual virtual static void fun() { }};同样地,静态成员函数也不能被声明为const和volatile.下面的程序也会编译失败。#include<iostream>class Test{ public: // 编译错误: static成员函数不能为const static void fun() const { } // 如果声明为下面这样,是可以的。 const static void fun() {} 或类似于 const static int fun() { return 0; }};2.为何static成员函数不能为virtual1. static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。2. 静态与非静态成员函数之间有一个主要的区别。那就是静态成员函数没有this指针。 虚函数依靠vptr和vtable来处理。vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable. 对于静态成员函数,它没有this指针,所以无法访问vptr. 这就是为何static函数不能为virtual. 虚函数的调用关系:this -> vptr -> vtable ->virtual function通过下面例子可以确定,当类增加了一个虚函数后,类的大小会增大4字节(指针的大小).class Test{public: int _m;};sizeof(Test) = 4;加入虚函数后,class Test{public: int _m; virtual void fun();};sizeof(Test) = 83.为何static成员函数不能为const函数当声明一个非静态成员函数为const时,对this指针会有影响。对于一个Test类中的const修饰的成员函数,this指针相当于Test const *, 而对于非const成员函数,this指针相当于Test *. 而static成员函数没有this指针,所以使用const来修饰static成员函数没有任何意义。 volatile的道理也是如此。public: int _m; virtual void fun();};sizeof(Test) = 8volatile 与const类似 ,volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
阅读全文
1 0
- static成员函数不能被声明为const virtual volatile 原因
- C++静态成员函数不能声明为const、volatile、virtual的原因 与 C++的对象模型
- 为何static成员函数不能为virtual
- 为什么static 成员函数不能为const
- c++ 类成员函数如果被static修饰,就不能为const修饰
- Static成员函数不能修饰const
- const/static 成员函数
- inline内联函数不能为virtual虚函数的原因
- C++ 函数返回值声明为const的原因
- C++ 函数返回值声明为const的原因
- 构造函数不能声明为虚函数的原因是:
- 构造函数不能声明为虚函数的原因是:
- const成员函数与static成员函数
- 修饰类成员函数的几个关键字:inline, const, explicit, static, virtual
- 基类析构函数声明为virtual
- C++点滴——const/volatile不能用来修饰没有this指针的成员函数
- 为什么内联函数,构造函数,静态成员函数不能为virtual函数
- 为什么内联函数,构造函数,静态成员函数不能为virtual函数
- 什么是 UCOS操作系统及特点
- Linux Crontab定时任务
- 斯坦福CS231n 2017春季课程全公开,视频+PPT+英文字幕
- srs 服务器在客户端断开连接后,服务器代码跟踪分析
- 前端排序算法总结
- static成员函数不能被声明为const virtual volatile 原因
- 押韵令1
- 【P OJ 2406】Power Strings(KMP)
- 利用MyCAT实现MySQL的读写分离和主从切换
- windows 10系统安装与配置Tomcat服务器环境
- 数组连续数字去重问题
- POJ 3080 Blue Jeans (KMP+暴力枚举)【模板】
- 押韵令2
- Android面试(Activity生命周期)