没有实例化的对象依然看一调用方法

常常被告诫,没有实例化的对象不能调用其成员方法。真的对吗?答案肯定不是。

其实钻一钻编译运行机制的空子是可以到的。

你执行一下下面的代码看看,是不是输出了“help”

class MyClass{
public:
    int data;
    MyClass(){

    }
    void print(){
        cout<<"help"<<endl;
    }
};
int main(int argc, const char * argv[]) {
    MyClass temp;
    temp.print();
    return 0;
}

为什么呢?

让我们捋一捋代码编译的过程:

当类被编译的时候,函数的地址就已经确定了。这个函数地址是被所有的该类对象共享的。

每实例化一个类对象就会有一块对象地址被分配出来,由一个叫做this的指针指向这个类的数据部分。

当调用成员方法的时候直接就找到了函数的地址,而且这个函数中没有用到对象的数据,当然就不会由任何问题。

时间: 2024-08-07 10:59:32

没有实例化的对象依然看一调用方法的相关文章

使用反射构造对象实例并动态调用方法

在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释如下: 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对它们进行访问. 主要用途: 动态加载DLL,实现插件机制. 实例化DLL中的类型. 执行后期

只声明对象也能调用方法但不起作用的原因分析

今天犯二了,搞一个locationManager一直不起作用,在加上权限声明后didupdatelocation这个必定会执行的方法还是没执行,用网上的代码粘贴就能用,我是百思不得其解. 后来终于发现问题根源:我只用@property声明,viewDidLoad方法里面没有实例化 在追悔自己2的时候,还纳闷系统为什么不报错呢? 网上没找到答案,自己猜测: 对象的声明:只是在栈上开辟了一个(固定大小?)空间(即指针地址)(2.对象的声明和基本变量都是放在栈上的) 初始化时:会在堆内存分配该对象所需

类对象可直接访问属性,但未实例化不能调用方法

>>> class MyClass: name = 'FishC' def mufun(self): print('hello Fishc!') >>> MyClass.name#类对象对类的属性进行直接访问 'FishC' >>> MyClass.mufun()#但是类没有实例化,访问其中的方法,则成为不可能. Traceback (most recent call last): File "<pyshell#18>"

[转]关于Unity3D对象和脚本实例调用的顺序探究

http://blog.csdn.net/liangzg_2011/article/details/8150844 关于Unity3D对象和脚本实例调用的顺序探究 我们先来看一些有趣Unity实例顺序的小实验.有图有真相!! 注:以上打印的代码语句如下: [csharp] view plaincopy <span style="font-size:18px;">    void Start () { print("-----" + this.transf

JS创建类和对象,看完了,头就不大了

JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它允许你通过变量名存储和访问,换一种思路,对象是一个无序的属性集合,集合中的每一项都由名称和值组成(听起来是不是很像我们常听说的HASH表.字典.健/值对?),而其中的值类型可能是内置类型(如number,string),也可能是对象. 一.由一对大括号括起来 var

实例化类对象中alloc和inti的区别

在OC中,实例化一个类对象需要通过调用alloc和init两个系统既定方法进行初始化,比如: Fraction *frac=[[Fraction alloc]init]; 两者的区别如下: 1.alloc方法保证对象所对应的类里定义的所有实例变量都变成初始状态,但并没有使该对象本身进行初始化: 2.init方法用于初始化类要实例化的对象,它可以返回一个值,即被初始化的对象. ps:当然实例化一个对象还可以采用一种简便的方式,比如: Fractiion *frac=[Fraction new];

子类实例化,父类构造器中被调用被子类重写的方法,会执行父类还是子类的呢?

public class Test001 { public static void main(String[] args) { new Child(); } }class Father{ private String name = "f"; public Father(){ tell(); } public void tell(){ System.out.println("father "+this.name); }}class Child extends Fath

JavaScript作用域、上下文环境、函数对象的定义与调用、匿名函数的定义与调用、闭包

提到闭包总给人很高深的感觉,网上的例子也数不胜数.但是我发现相当一部分并不容易理解.根据我的观察,是因为这些例子把标题中提到的概念糅杂在了一起,往往越看越糊涂.所以我希望化整为零,拆成简单例子来解释. 1.先看作用域: JavaScript作用域只有两种--全局作用域和函数内作用域,没有代码块作用域.示例: function loop(){ for(var i=0;i<5;i++){ //doSomething; } alert(i); } loop(); //执行函数结果为5. 尽管变量i已经

Java子类继承父类,当实例化子类对象时的执行顺序

子类继承父类,当实例化子类对象时,执行顺序如下:     父类层级静态块      自身静态块     父类块      父类构造器     自身块      自身构造器 由于继承,肯定应该先加载父类再加载子类,加载类自然会调用静态块,然后是调用父类的构造函数和子类的构造函数,不过构造函数调用前肯定要先调用域或块,这样才能正确创建对象. ················································赋值顺序如下:     父类的静态变量赋值     自身的静态变