空类指针为什么可以调用类的成员函数 以及 A(){}和A();
1. 代码及问题
#include <iostream>
using namespace std;
class A
{
public:
A() {} //A *p = new A()时:此时A须写成A() {}
void hello()
{
std::cout << "hello" << std::endl;
}
};
int main()
{
A *p = new A();
p = NULL;
p->hello(); //空类指针为什么可以调用类的成员函数 ?
return 0;
}
2.论坛里的解答
观点A:
p->hello();执行的时候,hello接收的this指针就是p(即NULL),但hello方法没有用到this指针,所以不会出错
观点B:
因为你的成员函数里面 没有使用this指针
class test
{
public:
test(){}
void hello(){a = 1;} //这个函数就不能调用了,这里实际上是 this->a = 1;
int a;
};
观点C:
当实例指针delete或指空后,只要没使用到this,都没事的
想想内存的存放,就知道了
class编译的时候,函数是在全局代码区,new一个实例是在堆上(被置空或delete),指针调用函数(代码区),由于没使用到this(在堆上)所以正常运行
3. 自己衍生的问题
#include <iostream>
using namespace std;
class A
{
public:
A(); //A *p时:此时A可以写成A(); A(){}和A();的区别在哪呢
void hello()
{
std::cout << "hello" << std::endl;
}
};
int main()
{
A *p;
p = NULL;
p->hello()
return 0;
}
空类指针为什么可以调用类的成员函数 以及 A(){}和A();的更多相关文章
- C++中的空类,编译器默认可以产生哪些成员函数
C++中的空类,编译器默认可以产生哪些成员函数 C++中创建一个空类:class Empty {};默认会生成4个函数,其函数的原型如下: public: Empty() { ... } Empty( ...
- 类成员函数指针的特殊之处(成员函数指针不是指针,内含一个结构体,需要存储更多的信息才能知道自己是否virtual函数)
下面讨论的都是类的非静态成员函数. 类成员函数指针的声明及调用: 1 2 3 4 5 6 7 //pr是指向Base类里的非静态成员函数的指针 //其行参为(int, int),返回值为void vo ...
- 为什么const对象只能调用const成员函数,而不能调用非const成员函数?
在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理. 假设有一个类,名字为test代码如下: clas ...
- 怎么在const成员函数里面调用非const成员函数?
举个例子: 定义了一个类的const实例,怎么让他也能调用非能调用非const成员函数class foo{public:void test1() {cout << "I am n ...
- boost::serialization 用基类指针转存派生类(错误多多,一波三折)
boost::serialization 也支持c++的多态,这样我们就能够通过使用基类的指针来转存派生类, 我们接着上一篇( boost::serialization(2)序列化基类 )的样例来看: ...
- Map中放置类指针并实现调用
工作中使用到多进程通信,利用到了map以及multimap来进行实现. 需要做一个简单测试例子,直接上代码. /* * main.cpp * Created on: Oct 28, 2013 * Au ...
- C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数
class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty ...
- python类内部调用自己的成员函数必须加self
class A: def a(self): print("hello world") def b(self): return self.a() 上面的self.a()中self是不 ...
- python类中保存非绑定方法作为成员函数
习惯了函数式,动不动传一个函数.但是直接把函数作为类方法保存,再调用时会报错. 举一个unittest时的例子 class MyTestCase(unittest.TestCase): @classm ...
随机推荐
- jQuery给动态添加生成的元素绑定事件的方法
<div id="testdiv"> <ul></ul> </div> 需要给<ul>里面动态添加的<li&g ...
- thinkphp3.2 判断星期几
后台 $w=date('w'); $week=array( "=>"星期日", "=>"星期一", "=>&qu ...
- WP8.1学习系列(第十七章)——交互UX之输入和反馈模式
如果你将 Windows 应用商店应用设计为触摸交互,则可免费获取对触摸板.鼠标.笔和键盘交互的支持.你的用户可以从一种输入法切换到另一种,而不会丧失应用体验的感觉.将键盘插入平板电脑?没问题.你的应 ...
- delphi 10 Seattle 第一个Android程序
delphi 10 Seattle 第一个Android程序 1.打开Delphi RAD Studio Seattle,如下图 2.选择black application 点击OK 3. ...
- JS插件---->SyntaxHighlighter的使用
SyntaxHighlighter是一款用于web页面的代码着色工具,可以用来着色多种语言.今天我们通过实例来学习一下它的用法.旧同桌不是老情人,但与你分享过的青春不比初恋少半分. SyntaxHig ...
- smarty直接在模板中格式化时间的方法
smarty提供了一个获取时间戳的方法: <%$smarty.now%> 使用该方法获取到当时的时间戳之后,使用格式化修饰符data-format进行修饰: <%$smarty.no ...
- POJ 2456 Aggressive cows(二分答案)
Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22674 Accepted: 10636 Des ...
- httpWebRequest获取流和WebClient的文件抓取
httpWebRequest获取流和WebClient的文件抓取 昨天写一个抓取,遇到了一个坑,就是在获取网络流的时候,人为的使用了stream.Length来获取流的长度,获取的时候会抛出错误,查了 ...
- github使用密钥登录
注册github之后 初次使用git的用户要使用git协议大概需要三个步骤: 一.生成密钥对 二.设置远程仓库(本文以github为例)上的公钥 一.生成密钥对 再window系统中可以通过x ...
- vue---结合elementui做异步数据分页
使用vue+elementui来请求数据做分页: <el-col :span="24" class="toolbar pageBar"> <e ...