c++几个面试题
来源:互联网 发布:mac如何打开exe 编辑:程序博客网 时间:2024/04/30 20:18
题目一:
static和const都可以修饰一个类的成员函数,请问:能不能同时用static和const修饰类的成员函数?
温馨提示:
const的位置是在函数后边,修饰一个类的成员函数是写在函数的最后,而不是前边。前边的只是限制了返回值类型。
分析:答案是不能的。C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时static的用法和static是冲突的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。
题目二:
运行下面代码,输出的结果是:
A.h
class A{private: int m;public: A(int a) { m=a; } void print1() { printf("Hello world"); } void print2() { printf("%d",m); }};main函数
int main(int argc, const char * argv[]) { A* P=NULL; P->print1(); P->print2(); return 0;}
运行结果会崩溃。
分析:答案是print1调用正常,打印出Hello world,但运行至print2时,程序崩溃。调用print1时,并不需要P的地址,因为print1的函数地址是固定的。编译器会给print1传入一个this指针,该指针为NULL,但在print1中该this指针并没有用到。只要程序运行时没有访问不该访问的内存就不会出错,因此运行正常。在运行print2时,需要this指针才能得到m_value的值。由于此时this指针为NULL,因此程序崩溃了。
题目三:
运行下面代码,输出的结果是:
class A{private: int m;public: A(int a) { m=a; } void print1() { printf("Hello world"); } virtual void print2() { printf("%d",m); }};main函数
int main(int argc, const char * argv[]) { A* P=NULL; P->print1(); P->print2(); return 0;}程序崩溃
分析:print1就不用多说,和上边的一样。当调用虚函数print2的时候,要根据实例(即this指针指向的实例)中虚函数表指针得到虚函数表,再从虚函数表中找到函数的地址。由于这一步需要访问实例的地址(即this指针),而此时this指针为空指针,因此导致内存访问出错。
0 0
- 几个内存相关面试题(c/c++)
- 几个内存相关面试题(c/c++)
- C,C++的几个面试题小集
- 几个有趣的c面试题
- C,C++的几个面试题小集
- 几个程序员面试题
- 记几个面试题
- 几个面试题
- 几个C#面试题
- 几个PHP面试题
- 记录几个面试题
- oracle几个面试题
- 几个面试题精选
- 几个面试题
- 几个面试题
- 几个面试题
- 几个JavaScript面试题
- 几个ios面试题
- Android之双击回到顶部
- 改变Placeholder字体颜色
- 《从零开始学Swift》学习笔记(Day 9)——离开表达式你试试!
- sublime常用快捷键
- 【NOIP 模拟题】[山东多校联合模拟赛 day1 T1] 矩形计数(暴力)
- c++几个面试题
- block和代理,通知的区别
- 使用Spring JDBCTemplate简化JDBC的操作
- 229. Majority Element II
- WebView的简单使用
- android studio 修改 debug 签名
- OS X入门 — 使用brew安装zookeeper
- 项目经理应该知道的97件事--你并不是非比寻常的
- Android支付接入