精华内容
下载资源
问答
  • 起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计中,有时候不使用new的确会带来很多问题。当然这都是跟new的用法有关的。new创建类对象,使用...

    起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计中,有时候不使用new的确会带来很多问题。当然这都是跟new的用法有关的。new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。

    C++ 对象实例化的一些概念
    C++ 如果直接定义类,如classA  a; a存在栈上(也意味着复制了对象a在栈中);
    如果classA  a = new classA就存在堆中。

    一、new创建类对象与不new区别

    下面是自己总结的一些关于new创建类对象特点:

    • new创建类对象需要指针接收,一处初始化,多处使用
    • new创建类对象使用完需delete销毁
    • new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
    • new对象指针用途广泛,比如作为函数返回值、函数参数等
    • 频繁调用场合并不适合new,就像new申请和释放内存一样

    二、new创建类对象实例

    1、new创建类对象例子:

    CTest* pTest = new CTest();

    delete pTest;

    pTest用来接收类对象指针。

    不用new,直接使用类定义申明:

    CTest mTest;

    此种创建方式,使用完后不需要手动释放,该类析构函数会自动执行。而new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。

    2、只定义类指针

    这跟不用new申明对象有很大区别,类指针可以先行定义,但类指针只是个通用指针,在new之前并为该类对象分配任何内存空间。比如:

    CTest* pTest = NULL;

    但使用普通方式创建的类对象,在创建之初就已经分配了内存空间。而类指针,如果未经过对象初始化,则不需要delete释放

    3、new对象指针作为函数参数和返回值

    下面是天缘随手写一个例子,不太严谨。主要示意一下类指针对象作为返回值和参数使用。

    class CTest {  public:   int a;  };    
    class CBest {  public:   int b;  };    
    CTest* fun(CBest* pBest) {  
                               CTest* pTest = new CTest();   
                               pTest->a = pBest->b;   return pTest;  
    }    
    int main() {  
                 CBest* pBest = new CBest();   
                 CTest* pRes= fun(pBest);      
                 if(pBest!=NULL)    
                 delete pBest;   
                 if(pRes!=NULL)    
                 delete pRes ;   
                 return 0;  
    }

    C++对象实例化

    JAVA:
    A a = new A();
    为A对象创建了一个实例,但在内存中开辟了两块空间:一块空间在堆区,存放new A()这个对象;
    另一块空间在堆栈,也就是栈,存放a,a的值为new A()这个对象的内存地址。因为java在JVM中运行,
    所以a 描述的内存地址不一定是这个对象真实内存的地址。
    
    Object o; // 这是声明一个引用,它的类型是Object,他的值为null,还没有指向任何对象,该引用放在内存的栈区域中。
    
    o = new Object(); // new Object()句,实例化了一个对象,就是在堆中申请了一块连续空间用来存放该对象。
    = // 运算符,将引向o指向了对象。也就是说将栈中表示引用o的内存地址的内容改写成了Object对象在堆中的地址。
    
    C++:
    C++ 如果直接定义类,如classA a; a 存在栈上(也意味着复制了对象a在栈中),如果classA a = new classA就存在堆中。

    初学Java时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多Java书中,把对象和对象的引用(实例)混为一谈

    如果分不清对象与对象引用,那实在没法很好地理解下面的面向对象技术,把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路。        

    为便于说明,我们先定义一个简单的类:  
    class student
    {
          int name;
          int age;
          int sex;
    }

    有了这个类(模板),就可以用它来创建对象:student stu1 = new  student();

    通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作

    1)右边的"new  student",是以student类为模板,在堆空间里创建一个student类的对象(也简称为student对象)

    2)末尾的()意味着,在对象创建后,立即调用student类的构造函数,对刚生成的对象进行初始化

        构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。

    3)左边的"student stu1"创建了一个student类引用变量。所谓student类引用,就是以后可以用来指向某个

        student对象的对象引用,它指向的是某个student对象的内存地址(有点C语言中指针的味道)

    4)"="操作符使对象引用指向刚创建的那个student对象

        我们可以把这条语句拆成两部分student  stu1;                 (1)

                                                                 stu1 = new student();     (2)

        效果是一样的

        这样写,就比较清楚了,有两个实体:一是对象引用变量(stu1),在Sun公司的实现中,对象的引用是一个句柄,其中包含一对指针:一个指针指向该对象的方法表,一个指向该对象的数据另一个是对象本身(就是new出来的那个对象)

        在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是,我们看不见,也摸不着。不仅如此,我们仔细研究一下第二句,想想刚刚创建的student对象叫什么名字?

        有人说,它叫"student"。不对,"student"是类(对象的创建模板)的名字。一个student类可以据此创建出无数个对象,这些对象不可能全叫"student"对象连名都没有,没法直接访问它。我们只能通过对象引用(实例)来间接访问对象

        为了形象地说明对象、对象引用及它们之间的关系,可以做一个或许不很妥当的比喻:

        对象好比是一只没有线的风筝,引用变量是一根线,可以用来系风筝。如果只执行了第一条语句还没执行第二条,此时创建的引用变量stu1还没指向任何一个对象,它的值是null,引用变量可以指向某个对象,或者为null。这时stu1是一根线,一根还没有系上任何一个风筝的线。

       执行了第二句后,一只新风筝做出来了,并被系在stu1这根线上。我们抓住这根线,就等于抓住了那只风筝。

       再来一句:student  stu2;就又做了一根线,还没系上风筝。如果再加一句:stu2=stu1;系上风筝了

       这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用

       结果是,stu2也指向了stu1所指向的对象,也就是两根线系的是同一只风筝。

       如果用下句再创建一个对象:stu2=newstudent();则引用变量stu2改指向第二个对象。

       从以上叙述再推演下去,我们可以获得以下结论:

       (1)一个对象引用可以指向0个或1个对象(一根线可以不系风筝,也可以系一个风筝),而且可以改指;

       (2)一个对象可以有N个引用指向它(可以有N条线系同一个风筝)

        如果有下面语句:stu1=stu2;

        按上面的推断,stu1也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条线系住它,它飞了。

        很多书里说,它被Java的垃圾回收机制回收了,这不确切,准确地说,它已成为Java垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。由此看来,new  student();该语句应该不合法吧,至少是没用的吧?不对,它是合法的,而且可用的。譬如,如果我们仅仅为了打印而生成一个对象,就不需要用引用变量来系住它。最常见的就是打印字符串:System.out.println("Iam Java!");

        字符串对象"I amJava!"在打印后即被丢弃,有人把这种对象称之为临时对象。

    最后再说明一下:

    C++中:

    Student  student(20) ;  //这里student是引用 对象分配在 栈空间中,这里只是我的理解

    Student *student = new  Student(20);  //这里student是指针,new Student(20)是分配在堆内存空间的

    但是在Java中

    Student  student(20) ;  //注意:java中没有这样实例化对象的, 要想得到一个对象 必须要new出来.

    Student student ; //这个只是定义了一个引用 ,没有指向任何对象

    Student student = new Student(20);   //定义了一个引用,指向堆内存中的student对象


    展开全文
  • new出来的对象需要delete销毁,不用new的对象只能在它的作用域使用,作用域结束对象自动调用类的析构函数 new出来的对象在堆空间,不用new的在栈空间 转至 http://blog.csdn.net/chang_ge/article/details/52750393

    一. new创建对象与不new的区别

    • new创建的对象需要指针接收,一出初始化,多出使用
    • new出来的对象需要delete销毁,不用new的对象只能在它的作用域使用,作用域结束对象自动调用类的析构函数
    • new出来的对象在堆空间,不用new的在栈空间

    转至 http://blog.csdn.net/chang_ge/article/details/52750393

    展开全文
  • 收集几个 MFC串行化数据和C++对象实例 收集几个 MFC串行化数据和C++对象实例
  • 主要介绍了C++和对象,从定义出发再到实例解析,深入的理解C++和对象,需要的朋友可以参考下
  • C++和对象实例解析

    千次阅读 2017-01-12 11:08:29
    C++和对象实例解析
    这篇文章主要介绍了C++类和对象,从定义出发再到实例解析,深入的理解C++类和对象,需要的朋友可以参考下

    C++既是面向对象也是面向过程的语言,在这里就有一个重要的概念——
            何谓类?类是对对象的一种抽象,举例来讲:每一个实实在在存在的人就是一个对象,人有很多共同的特征(一个头,两条腿,能走,能跑),这具有共同特征的人就成为一个类。类是一个抽象的名词,每一个人(即对象)是这个类的实例。
            对象间具有的共同特征是对象的属性和行为。录像机是一个对象,它的属性是生产厂家、牌子、重量、颜色等等,它的行为就是它的功能,如录像、放像、快进、倒退等操作。
    C++程序中,需要先定义一个类,形如:
      Class 类名
         { 
            定义变量;
            ….
            定义函数
          }
    在类体中时成员列表,包括数据和操作数据的函数,即数据成员、成员函数。这体现了类的封装性和信息的隐蔽性。
    成员函数一般在类体中声明,在类体外定义。
    构造函数:对对象进行赋值
    析构函数:在函数功能域结束时,释放对象成员的空间。
    内联函数:为了节省函数调用的时间
    完成各种功能函数…….
    定义对象就需要对类进行实例化。形如:类名对象名

            类是一个抽象,它不占任何内存,只有当其实例化成为对象之后,才会给其分配空间。
            计算机中就是用对象来描述大千世界的事物。对象之间通过消息建立联系,借助函数完成各种各样的功能。
    简单的说,这就是对象和类。

    下面通过实例理解

    【2-1】定义一个日C++类和对象期类date,该类对象存放一个日期,可以提供的操作有:取日期值,取年份,提取月份,提取日期以及设计日期值。
    【分析】这个程序需要先定义一个类类型,这个类的数据成员有year,month,day,并且将其设计为private访问权限。还需要有5个成员函数,分别为:

    void getdate();          //取日期值,格式为“year-month-day”
    int getyear();          //取年份
    int getmonth();         //取月份
    int getday();          //取日期
    void setdate(int y,int m,int d);    //设置日期值
    程序代码如下:
    #include <iostream>
    using namespace std;
    class date
    {
    public:
     void getdate();
     int getyear();
     int getmonth();
     int getday();
     void setdate(int y,int m,int d);
    private:
     int year,month,day;
    };
    int date::getyear(){ return year; }
    int date::getmonth(){ return month; }
    int date::getday(){ return day; }
    void date::getdate()
    { cout<<"today is:"<<year<<"-"<<month<<"-"<<day<<endl; }
    void date::setdate(int y,int m,int d)
    { year=y; month=m; day=d;  }
    int main()
    {
     date d;
     d.setdate(2011,2,1);
     cout<<"year="<<d.getyear()<<endl;
     cout<<"month="<<d.getmonth()<<endl;
     cout<<"day="<<d.getday()<<endl;
     d.getdate();
     return 0;
    }
    

    【总结】这是一个最简单的类程序,但其中也存在不少问题。比如,如果没有setdate()函数,就无法对对象赋初值,而且必须按照特定的格式对对象进行设置初值。这个问题就应该采用构造函数来进行对象初始化。
    【2-2】对例【2-1】进行改进,要求使用构造函数进行对象初始化,并且格式要不一致。
    【分析】这个例子需要使用构造函数,并且要用到构造函数重载,使用默认参数值的构造函数和拷贝构造函数。
    程序代码如下:

    #include <iostream>
    using namespace std;
    class date
    {
    public:
     date(int y=0,int m=0,int d=0)
     { year=y; month=m; day=d; }
     date(date &d)
     { year=d.year; month=d.month; day=d.day; }
     void getdate()
     { cout<<"today is:"<<year<<"-"<<month<<"-"<<day<<endl; }
     int getyear() { return year; }
     int getmonth() { return month; }
     int getday() { return day; }
    private:
     int year,month,day;
    };
    
    int main()
    {
     date d1(2011,2,1),d2,d3(d1);
     d1.getdate();
     d2.getdate();
     d3.getdate();
     return 0;
    }
    
    

    【总结】程序中的对象d1有完整的实参表,则调用构造函数来进行对象初始化;对象d2没有实参表,系统同样自动调用构造函数进行对象初始化,只不过形参的值采用默认参数值进行初始化。对于对象d3,则采用拷贝构造函数进行初始化。
    【2-3】输入数据到数组内求和、最大值、最小值与平均值后输出,将成员函数定义在类外。
    【分析】这个程序时对C语言中所学内容的一个总结,是从面向过程到面向对象的跨越。这个类的数据成员应该包括数组。成员函数应该有数组输入函数、数组输出函数、求和函数、最大值函数、最小值函数和求平均值函数。
    程序代码如下:

    #include <iostream>
    using namespace std;
    #define N 10
    class array
    {
    public:
     void input();
     void output();
     int max();
     int min();
     int sum();
     float average();
    private:
     int a[N],maxnumber,minnumber,sumnumber;
     float avenumber;
    };
    void array::input()
    {
     int i=0;
     cout<<"Please input "<<N<<" numbers:"<<endl;
     for(i=0;i<N;i++)
     {
     cout<<"a["<<i<<"]=";
     cin>>a[i];
     }
    }
    void array::output()
    {
     int i=0;
     cout<<"array a is:"<<endl;
     for(i=0;i<N;i++)
     cout<<a[i]<<" ";
     cout<<endl;
    }
    int array::max()
    {
     int i;
     maxnumber=a[0];
     for(i=1;i<N;i++)
     if(maxnumber<a[i])
      maxnumber=a[i];
     return maxnumber;
    }
    int array::min()
    {
     int i;
     minnumber=a[0];
     for(i=1;i<N;i++)
     if(minnumber>a[i])
      minnumber=a[i];
     return minnumber;
    }
    int array::sum()
    {
     int i;
     sumnumber=a[0];
     for(i=1;i<N;i++)
     sumnumber+=a[i];
     return sumnumber;
    }
    float array::average()
    {
     float ave=static_cast<float>(sumnumber/N);
     return ave;
    }
    int main()
    {
     array a;
     a.input();
     a.output();
     cout<<"The max number is "<<a.max()<<endl;
     cout<<"The min number is "<<a.min()<<endl;
     cout<<"The sum number is "<<a.sum()<<endl;
     cout<<"The average number is"<<a.average()<<endl;
      return 0;
    }
    

    【总结】从上面的程序可以看出,类array里面包括对数组的各种操作,包括求和,求最大值,求最小值以及求平均值等。
    【2-4】设计一个表示猫的类,包括猫的颜色、体重、年龄等数据,具有设置猫的颜色,修改和显示猫的体重、年龄等操作。
    【分析】设计猫类的类名为Cat,此类有3个数据成员,颜色用string类表示,可以存放汉字,体重用实数类型表示,年龄用整数型表示,为了保护数据的安全性,3个数据成员全部为私有性。对猫的属性数据的设置和修改,全部为公有函数。
    程序代码如下:

    #include <iostream>
    #include <string>
    using namespace std;
    class Cat
    {
    public:
     Cat(string c="red",float w=1,int a=1);
     string get_color();
     float get_weight();
     int get_age();
     void display();
    private:
     string color;
     float weight;
     int age;
    };
    Cat::Cat(string c,float w,int a)
    {
     color=c;
     weight=w;
     age=a;
    }
    string Cat::get_color()
    {
     return color;
    }
    float Cat::get_weight()
    {
     return weight;
    }
    int Cat::get_age()
    {
     return age;
    }
    void Cat::display()
    {
     cout<<"The color of this cat is "<<get_color()<<endl;
     cout<<"The weight of this cat is "<<get_weight()<<endl;
     cout<<"The age of this cat is "<<get_age()<<endl;
    }
    int main()
    {
     Cat c1,c2("yellow",1,2);
     cout<<"c1 is:"<<endl;
     c1.display();
     cout<<"c2 is:"<<endl;
     c2.display();
     return 0;
    }
    

    【总结】从上面的程序可以看出,构造函数可以用类对对象进行初始化,并且构造函数可以进行重载。

    希望本文可以对大家学习c++编程语言有所帮助,也希望大家可以继续关注!

    展开全文
  • c++ 字符串实例对象,通过map绑定字符和对象
  • 主要介绍了C++对象的浅复制深复制详解及简单实例的相关资料,需要的朋友可以参考下
  • 面向对象编程实例c++

    2008-07-09 14:50:05
    面向对象编程实例c++
  • 主要介绍了C++中Semaphore内核对象用法实例,有助于深入了解信号量(Semaphore)的基本用法,需要的朋友可以参考下
  • 在次有大量的关于c++面向对象编程的实例 对于初级的学习者有很大的帮助
  • C++对象实例化及调用

    万次阅读 2017-08-01 11:15:43
    class TV { public: int type; void changeVol() { cout ; } };从栈中实例对象调用TV tv; Tv.type = 0; Tv.changeVol();从堆中实例对象调用TV *p = new TV(); if(NULL == p) {
    class TV
    {
    public:
        int type;
        void changeVol()
        {
            cout << "vol changed" <<endl;
        }
    };

    从栈中实例化对象调用

    TV tv;
    Tv.type  =  0;
    Tv.changeVol();

    从堆中实例化对象调用

    TV *p = new TV();
    if(NULL == p)
    {
        return 0;
    }
    p->type  =  0;
    p->changeVol();
    delete p;
    p = NULL;
    展开全文
  • c++关于类和对象实例

    千次阅读 2017-10-24 20:41:34
    c++是面向对象的程序设计。 重要的概念:类、对象、数据成员、成员函数、共有、私有。 具体实例如下: http://c.biancheng.net/cpp/biancheng/view/2162.html 定义一个类,定义此类的对象,引用类的多个成员 引用...
  • C++ 对象实例化方法

    千次阅读 2011-07-22 17:40:50
    问:c++里面, 创建对象, ClassName object(初始化参数);在Stack栈里面分配空间,自动释放。或者用
  • 主要介绍了C++实现动态分配const对象实例,包括了const对象的创建、删除及应用实例,需要的朋友可以参考下
  • C++和JAVA实例对象的区别

    千次阅读 2013-05-30 17:31:55
    为A对象创建了一个实例,但在内存中开辟了两块空间:一块空间在堆区,存放new A()这个对象;另一块空间在堆栈,也就是栈,存放a,a的值为new A()这个对象的内存地址。因为java在JVM中运行,所以a 描述的内存地址...
  • 下面小编就为大家带来一篇C++之类和对象课后习题简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 实例体现了C++面向对象的编程思想,封装了linux下的epoll模型和C++的观察者模式,套接字通信全部采用非阻塞的方式,能很好的体现面向对象的设计思路。
  • C++对象实例创建的N种方法

    千次阅读 2017-02-13 21:50:20
    不使用new关键字 在Stack栈里面分配空间,自动释放。 使用new关键字 动态的,不确定分配空间大小 在heap堆里面分配空间,要手动释放(delete a或者delete a[],如果a是数组的话)
  • C++类的实例对象

    千次阅读 2018-09-02 18:47:11
    C语言使用函数对内容进行封装的,而C++是用类进行封装的 正文 类的关键字是class,而类的作用域也不同 类作用域 1.全局域 2.局部域 3.类域 4.名字空间域 类的实例化 类的实例化就是用类类型创建对象...
  • 主要介绍了利用C++内核对象封装的类,程序只能运行单个实例,可防止多次启动,大家参考使用吧
  • 该文档给出两个关于c++类与对象实例,是一个非常不错的C++学习资源!
  • C++之类与对象实例

    千次阅读 2018-11-18 17:03:14
    对象对象是类的一个实例对象不是找个女朋友),有状态行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。 类:类是一个模板,它描述一类对象的行为状态。 在C++中类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 319,826
精华内容 127,930
关键字:

c++对象和实例

c++ 订阅