精华内容
下载资源
问答
  • 前一个问题是:非多态情况下,用基类指针去访问派生的函数。 那么又要问了:多态情况下,怎么用基类指针去访问基类的函数呢?当然这里指的是虚函数。... 在用指针去调用数据成员、非虚成员函数时...

    前一个问题是:非多态情况下,用基类指针去访问派生类的函数。

    那么又要问了:多态情况下,怎么用基类指针去访问基类的函数呢?当然这里指的是虚函数。

    答案是:用取内容运算符*获得派生类对象,然后再强制转换成基类的对象,用它去调用即可。

    ps. 同样的,在多态情况下,用基类指针new一个派生类对象,基类和派生类都会初始化一个对象,然后各自维护。

      在用指针去调用数据成员、非虚成员函数时,两者完全相同。

      唯一区别是,在多态时,基类指针调用虚函数时会转向派生类,而非多态时没有虚函数,因而没有这种特例。

    下面是测试程序,随意感受一下~

    View Code
     1 #include <iostream>
     2 using namespace std;
     3 
     4 class A
     5 {
     6 public:
     7 
     8 virtual void f()
     9     {
    10         cout<<"A"<<endl;
    11     }
    12 
    13 };
    14 class B : public A
    15 {
    16 public:
    17 
    18     void f()
    19     {
    20         cout<<"B"<<endl;
    21     }
    22 
    23 };
    24 
    25 
    26 void main()
    27 {
    28     A* p=new B;
    29     p->f();
    30     (*p).f();
    31     static_cast<A>(*p).f();
    32     delete p;
    33 }

     输出是

    这是做大摩的笔试题引出来的问题,还有好多关于C++语言细节的东西。做了才知道离精通C++还有很长路要走。

    师傅!九九八十一难到啥时候是个头啊?

    转载于:https://www.cnblogs.com/henrycodefarmer/archive/2013/04/12/3015865.html

    展开全文
  • 创建一个类对象后,最后将它release掉(引用计数为0了),那么指向它的指针如何处理呢,如果将它置为nil,说明这个指针指向任何地址,但是这个指针还是占着内存空间的,那么随着对象越来越多,那么指向对象指针...
    创建一个类对象后,最后将它release掉(引用计数为0了),那么指向它的指针是如何处理呢,如果将它置为nil,说明这个指针不指向任何地址,但是这个指针还是占着内存空间的,那么随着对象越来越多,那么指向对象指针越来越多,内存不是越来越不够用了吗  请速速回答,谢谢啦
    
    展开全文
  • 类型指针指向类元数据指针,方法区的Class模板。 示例数据:实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。 对齐填充:对齐填充并不是必然存在,也没有特别的含义,它仅仅起着占位符的...

    Java对象头的组成

    Java对象的对象头由 mark word 和 klass pointer 两部分组成,

    MarkWord:哈希码、GC分代年龄、锁状态标识、线程持有的锁、偏向的线程ID。

    类型指针:指向类元数据指针,方法区的Class模板。

    示例数据:实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。

    对齐填充:对齐填充并不是必然存在,也没有特别的含义,它仅仅起着占位符的作用。

    值得注意的是,如果应用的对象过多,使用64位的指针将浪费大量内存.64位的JVM比32位的JVM多耗费50%的内存。

    我们现在使用的64位 JVM会默认使用选项 +UseCompressedOops 开启指针压缩,将指针压缩至32位。

    64系统MarkWord图

    以64位操作系统为例,对象头存储内容图例。
    在这里插入图片描述
    简单介绍一下各部分的含义

    lock: 锁状态标记位,该标记的值不同,整个mark word表示的含义不同。

    biased_lock:偏向锁标记,为1时表示对象启用偏向锁,为0时表示对象没有偏向锁。

    biased_lock lock 状态
    0 01 无锁
    1 01 偏向锁
    0 00 轻量级锁
    0 10 重量级锁
    0 11 GC标记

    age:Java GC标记位对象年龄。

    identity_hashcode:对象标识Hash码,采用延迟加载技术。当对象使用HashCode()计算后,并会将结果写到该对象头中。当对象被锁定时,该值会移动到线程Monitor中。

    thread:持有偏向锁的线程ID和其他信息.这个线程ID并不是JVM分配的线程ID号和Java Thread中的ID是两个概念。

    epoch:偏向时间戳。

    ptr_to_lock_record:指向栈中锁记录的指针。

    ptr_to_heavyweight_monitor:指向线程Monitor的指针。

    验证对象头数据

    <dependency>
        <groupId>org.openjdk.jol</groupId>
        <artifactId>jol-core</artifactId>
        <version>0.9</version>
    </dependency>
    

    无锁验证

    package com;
    import org.openjdk.jol.info.ClassLayout;
    
    public class ObjectTest {
        
        public static void main(String[] args) {
            User p = new User();
            int hashCode = p.hashCode();
            String hex = Integer.toHexString(hashCode);
            System.out.println("HashCode十六进制:"+hex);
            print(p);
        }
    
        static void print(User p){
            System.err.println(ClassLayout.parseInstance(p).toPrintable());
        }
    }
    class User{
        private boolean a;
    }
    

    输出结果:
    在这里插入图片描述
    输出的第一行内容和锁状态内容对应:

    unused:1|age:4|biased_lock:1|lock:2

    ​ 0 0000 0 01 根据MarkWord图表示User对象正处于无锁状态

    第三行中表示的是被指针压缩为32位的klass pointer

    第四行则是我们创建的User对象属性信息 1字节的boolean值

    第五行则代表了对象的对齐字段 为了凑齐64位的对象,对齐字段占用了3个字节,24bit

    至于为什么数据是倒着存储的,请参考“大小端模式”。
    

    GC分代年龄为什么最大为15?

    因为Object Header采用4个bit位来保存年龄,4个bit位能表示的最大数就是15。
    

    验证GC垃圾回收

    回收前:
    在这里插入图片描述

     public static void main(String[] args) {
            User p = new User();
            int hashCode = p.hashCode();
            String hex = Integer.toHexString(hashCode);
            System.out.println("HashCode十六进制:"+hex);
            System.gc();
            print(p);
        }
    

    回收后:
    在这里插入图片描述
    由于手动触发了一次GC所以四个bit位从0000变成了0001.

    参照:
    https://blog.csdn.net/qq_32099833/article/details/103721326

    展开全文
  • 如果你压入的是这个对象的指针,但是由于这个指针指向的是这个对象的地址,如果这个对象发生了变化,原先压入的对象也会发生相应的变化。 以下是一些错误的做法 voronoicell c; map cells_1; map cells_2; whi

    当需要用vector以及map等容器存储一些类的对象时,如果这个类里数据成员有一些new出来的指针,那么当你压入这个对象时有可能里面的指针就被析构掉了。

    如果你压入的是这个对象的指针,但是由于这个指针指向的是这个对象的地址,如果这个对象发生了变化,原先压入的对象也会发生相应的变化。

    以下是一些错误的做法

    voronoicell c;
    map<int, voronoicell*> cells_1;
    map<int, voronoicell> cells_2;
    while (1){
    compute_cell(c);
    *cell_temp = c;
    cells_1.insert(make_pair(cell_id,cell_temp));
    cells_2.insert(make_pair(cell_id,c));
    }
    voronoicell是一个类,里面有的数据成员是new出来的,即动态分配内存的。

    以上第一个做法是压入c的指针,但是进入下一个循环的时候,如果c的数据成员发生改变,cells_1中先前压入的c的指针也会发生相应的变化。所以无效!

    第二个做法是压入c本身,但是map等STL容器在压入新的对象的时候,如果原先的空间不够的话,map会new出一个新的空间,把原来的数据成员拷贝出来,放到那个新的空间里,再把原来的空间析构掉。但是原来的空间保存了原先数据成员(那个new出来的指针)的地址,如果被析构掉的话,新空间里面的数据成员将指向一个无效的地址。那么c里面的那些动态分配的数据成员将全部无效。

    正确的做法是new出来一个空间,来存储一个临时的变量,将c赋值到这个空间的临时变量里(这个new出来的空间如果你自己不手动析构,程序将不会将其析构掉)。再将这个new出来的空间里的变量压入到容器里面。

    以下是正确的做法:

    voronoicell *cell_temp = new voro::voronoicell[1];
    *cell_temp = c;
    cells_1.insert(make_pair(cell_id,cell_temp));




    展开全文
  • C++面向对象之this指针

    2020-06-08 17:11:57
    C++通过this 指针指向调用成员函数的对象来解决这个问题。 this指针隐含在每个非静态成员函数内的一种指针。无需定义,直接即可。 this 的用途: 当形参和成员变量同名时,可以this指针来区分。 在的非...
  • 对于Object,该指针指向原始的object()函数。  prototype:对该对象对象原型的引用。对于所有的,它默认返回Object对象的一个实例。 方法  hasOwnProperty(property):判断对象是否有某个特定的属性。必须...
  • //来自对《深度探索C++对象模型 侯捷译》的一点总结、体会。 静态成员函数没有this指针,不与类的实例(对象)“挂钩... this指针指向类的某个实例(对象),叫它当前对象。 ①举例说明: class A { int i; voi...
  • 对象有一个指向虚表开始的虚指针。虚表是和对应的,虚表指针是和对象对应的。 3. 多态性是一个接口多种实现,是面向对象的核心。分为的多态性和函数的多态性。 4. 多态虚函数来实现,结合动态绑定。 5....
  • 在C++11中有两个智能指针类型来管理动态对象,share_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指对象。 我们知道指针或引用在离开作用域时是不会进行析构的,但是在离开作用域时会自动执行析构函数...
  • 对象有一个指向虚表开始的虚指针。虚表是和对应的,虚表指针是和对象对应的。 3. 多态性是一个接口多种实现,是面向对象的核心。分为的多态性和函数的多态性。 4. 多态虚函数来实现,结合动态绑定。 5....
  • 写在前面 自己的话分析清楚~ ...虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象。虚函数的出现是为了解决多态问题。 满足上述条件的类就可以定义智...
  • 实现功能2:用指向对象指针做函数参数,找出其中成绩最高者的学号并输出 不过我想说的主要是主函数中的代码片段,关于指针如何调用函数。 int main() { Student s[5]={Student("123",70.1),Student("456",60.2)...
  • 【转】虚函数-虚表-虚指针-多态性-如何实现多态-纯虚函数-抽象-转 ... 1. virtual关键字申明的函数叫做虚函数,虚函数肯定是...对象有一个指向虚表开始的虚指针。虚表是和对应的,虚表指针是和对象对应
  • 1. virtual关键字申明的函数叫做虚函数,虚函数肯定是的成员函数。...对象有一个指向虚表开始的虚指针。虚表是和对应的,虚表指针是和对象对应的。3. 多态性是一个接口多种实现,是面向对象的核心。分为
  • 这里介绍2种方法: 1:在CMyView中建立一个函数,在该函数中对本的控件进行操作,GetDlgItem(ID)可以得到控件的CWnd指针。 2:不建立函数,在CMainFrame中获得指向CMyView的指针后,再进行上一步中的操作 在...
  • 匿名对象

    千次阅读 2015-09-20 22:11:47
    我们之前创建对象的做法. ...也就是没有任何指针指向这个对象 那么这个对象就叫做匿名对象如何去使用1个匿名对象呢?因为new实际上1个方法. 这个方法做的事情创建对象(4个步骤). 返回值是创建
  • 侃侃c++ this指针

    2017-07-10 11:18:38
    每个类对象都有一个this指针,那程序怎么知道this究竟指向谁呢? 了很多this那么它们是如何区分的。为什么这个this说是指这个对象而不是那个?其实你只要清楚两点: 1.this的作用域(这个this就像你在不同的函数...
  • 实例对象的isa指针指向类对象,类对象的isa指针指向元类对象,元类对象的isa指针指向根类元类(如何指向请查看) 如图 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们...
  • 这适用于值、指针和被指向对象,也可以作为一个特别的属性应用于的成员函数上,表示成员函数不能修改对象的状态。 然而,const本身并没有提供太大的价值 —— 很多编程语言甚至没有类似const的关键词,但是却并...
  • C++this指针的用途

    2021-01-25 18:01:29
    this指针的用途: 1.当形参和成员变量同名时,可用this指针来区分。 2.在的非静态成员函数中返回对象本身,可使用return *this ...this指针指向被调用的成员函数所属的对象 简单来说,谁调用这个函数,th
  • 1、如何区分多个对象调用同一个函数?  外部访问成员,必须用对象来调用。一个的所有对象在调用的成员函数,都执行同一段代码,那成员函数如何区分属于哪个对象呢...不同对象调用成员函数时,this指针指向...
  • 多态在C++中继承和多态为它的俩大特性...当我们指向派生类对象的基类指针调用这个函数时,就会发生多态,当指针指向对象不同时,它就会调用不同类中的该函数。 那么何为赋值兼容规则呢,为什么Base类指针就可以指向
  • unique_ptr独占对象浅析

    2021-02-21 21:46:09
    在C++11中有两个智能指针类型来管理动态对象,share_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指对象。 我们知道指针或引用在离开作用域时是不会进行析构的,但是在离开作用域时会自动执行析构函数...
  • 非内联成员函数只会产生一份函数实例,也就是说多个类对象公用一份函数代码,那么这块函数代码如何区分到底是哪个类对象调用的自己呢?        this指针来区分类对象。 二. this指针介绍 (一...
  • 1.野指针野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。 ...
  • 针对上次的问题,this指针的暴露依照前面的解法应该shared_ptr来解决,但get()本身是个成员函数,如何获得一个指向当前对象的shared_ptr<StockFactory>对象呢? 可以使用enable_shared_from_this。这是一...
  • 多态是如何实现的

    2017-03-06 18:29:04
    对象有一个指向虚表开始的虚指针。虚表是和对应的,虚表指针是和对象对应的。 3. 多态性是一个接口多种实现,是面向对象的核心。分为的多态性和函数的多态性。 4. 多态虚函数来实现,结合动态绑定。 5....
  • 1:C++每个类对象的内存大小由:类中非静态成员内存的和,指向虚函数表的指针和内存对齐的内存三者共同决定。 内存如何对齐,我以前写过一篇博文里讲的很详细。 2:虚函数表里存放的是虚函数的内存地址,对象调用...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 149
精华内容 59
关键字:

如何用指针指向类对象