类对象定义方式总结

// ConsoleApplication34.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class A
{
public:
    int a;
     A();
};
A::A()
{
    cout << "hello world!" << endl;
}

class CExample {
private:
    int a;
public:
    CExample()  //定义过下边的自定义构造函数后,默认构造函数将不存在。因此需要重新写一遍
    {
        a = 1;
        cout << "hello " << endl;
    }
    CExample(int b)
    {
        a = b;
    }
    CExample(const CExample&  b)
    {
        a = b.a;
    }
    void Show()
    {
        cout << a << endl;
    }
};

int main()
{
    //不用new是在 栈 上定义的。
    CExample test1;
    CExample test2 = CExample();

    //new是在 堆 上定义的。 应使用delete释放内存
    //有括号代表的是调用 含参构造函数CExample(int b)
    //无括号代表的是调用  无参构造函数CExample()   等价于     CExample* test3 = new CExample()
    CExample* test3 = new CExample(2);
    CExample* test4 = new CExample;

    //拷贝构造函数系列
    CExample* test5(new CExample(6));
    CExample test7(test1);

    CExample test6(); //错误
    return 0;
}

以上给出了常用的几种定义方法及区别。

注意:

1. 有new是在堆上 无new是在栈上,new 与 delete搭配使用。

2.有new的情况下,括号的作用是指定构造函数。无括号即使用默认构造函数

=============================================================================================

堆与栈上定义的详细区别:

from:http://blog.sina.com.cn/s/blog_586b6c050100dhjg.html

在C++里,有两种方法创建对象:

方法一:

ClassName object(param);

这样就声明了一个ClassName类型的object对象,C++会为它分配足够的存放对象所有成员的存储空间。

注意:为节省存储空间,C++创建对象时仅分配用于保存数据成员的空间,而类中定义的成员函数则被分配到存储空间中的一个公用区域,由该类的所有对象共享。

例如,我定义了一个这样的类:

class Rec
{
   public:
   Rec(int width,int height);
   ~Rec();
   int getArea();

private:
   int Rwidth;
   int Rheight;
};

当你Rec myRec(5,5);这样创建一个myRec对象, 然后打印出sizeof(myRec);的时候,会得到 8 这个结果。

因为myRec中有2个int类型的数据成员,一个int成员占4个字节,所以myRec对象占8个字节。

这种方法创建的对象,内存分配是分配到栈中的,由C++缺省创建和撤销,自动调用构造函数和析构函数

注意:该方法创建的对象调用类方法时,必须用“.”,而不能用“->”.如myRec.getArea();

方法二:

ClassName *object=new ClassName(param);

delete object;

这种方法跟java有点类似,相同的是,它们都是在堆上分配内存来创建对象的(与上不同);不同的是,C++用new创建对象时返回的是一个对象指针,object指向一个ClassName的对象,C++分配给object的仅仅是存放指针值的空间。而且,用new 动态创建的对象必须用delete来撤销该对象。只有delete对象才会调用其析构函数。

注意:new创建的对象不是用“*”或“.”来访问该对象的成员函数的,而是用运算符“->”;

例如:Rec *rec=new Rec(3,4);

rec->getArea();

delete rec;

顺便提一下:

一般来说,编译器将内存分为三部分:静态存储区域、栈、堆。静态存储区主要保存全局变量和静态变量,栈存储调用函数相关的变量、地址等,堆存储动态生成的变量。 在c中是指由malloc,free运算产生释放的存储空间,在c++中就是指new和delete运算符作用的存储区域。

另外收集了两种方法的优点:

new出来的在堆上,直接定义的在栈上,栈的大小有限制

new的好处:

1、需要的时候才new(在复杂权限和业务逻辑系统中很重要)
2、对象可靠性检查(没有栈空间的限制问题)
3、对象的适度留用控制

=============================================================================================

new中的括号总结:

from:https://blog.csdn.net/wang13342322203/article/details/80807904

error:没有合适的默认构造函数可用 ,一般也是这个问题

括号分为两种,中括号[]或小括号()。为方便说明,定义指针类型为class test, 指针为test *ptest;

一、 中括号的情况。中括号是用来标示申请的是一个对象,还是一组对象。1 没有中括号时,即ptest = new test; 这时ptest得到的是一个对象*ptest, 释放时使用delete ptest;2 带有中括号时,在中括号中需要有一个正整数参数。ptest = new test[N]; N可以是变量,也可以是常量。这时申请到的ptest指向的空间是N个连续的对象ptest[0],ptest[1]...ptest[N-1],即可以当做一个数组使用。释放时需要调用delete [] ptest;

二、小括号的情况。小括号是用来指定初始化参数,用于类指针时,就是指定调用哪个构造函数。1 有小括号时,小括号中可以有若干参数,也可以没有参数。比如ptest = new test();  这样在构造时就会调用无参构造test();ptest = new test(1); 就会调用构造函数test(int),即一个整型参数的构造函数。

2 没有小括号时,默认调用无参构造。即ptest = new test;和ptest = new test();是一样的。===========================================================================================================================

原文地址:https://www.cnblogs.com/xuhongfei0021/p/12519560.html

时间: 2024-10-10 04:58:18

类对象定义方式总结的相关文章

开发技巧----------项目中常量类的定义方式

问题: 有开发经验的同学都知道,常量类是一个最常用的定义数据字典的方式.但是随着项目的开发时间和开发团队的变化经常会出现2中特别苦逼的情况.第一种情况是项目中到处都能看到各种各样的常量类:第二种情况是一个常量类里定义非常多的常量,甚至有的超过100了.这两种情况的缺点估计大家都非常的清楚,第一种代码离散.冗余.维护难:第二种也是维护难,更痛苦的时候用ide的时候很难找到自己需要的常量. 解决办法: 1.使用静态内部类对常量进行分组(可以多级分组,但是建议最多3级) 2.外部文件(这里不讨论) 3

03JavaScript程序设计修炼之道 2019-06-06_20-10-17_2019-06-06_21-12-50 对象定义方式:{}、构造;字符串及常用方法;

29object.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compat

多种对象定义方式

/** * 对象定义 * @authors Your Name ([email protected]) * @date 2019-08-18 15:10:38 * @version $Id$ */ var print0 = (function() { var test = {}; test.test0 = function() { console.log('test0') console.log(this) } return test })() //{}对象不用new var print = {

JavaScript对象定义方式剖析

JavaScript语句 with语句: (对象操作语句) 功能:为一段程序建立默认对象. 格式: with (<对象>){ <语句组> } 1 <body> 2 <!-- 不用每个write前面都写document --> 3 <script type="text/javascript"> 4 with(document){ 5 write("<ol>"); 6 write("<

C++ Primer 学习笔记_15_类与数据抽象(1)_类的定义和声明

C++ Primer 学习笔记_15_类与数据抽象(1)_类的定义和声明 在C++中,用类来定义自己的抽象数据类型.通过定义类型来对应所要解决的问题中的各种概念,可以使我们更容易编写.调试和修改程序.可以使得自己定义的数据类型用起来与内置类型一样容易和直观. 看一下Sales_item类: class Sales_item { private: std::string isbn; unsigned units_sold; double revenue; public: double ave_pr

Ember.js 入门指南——类的定义、初始化、继承

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站. Ember JS的类也具有高级语言的许多特性,其实现方式也与高级语言(如Java)非常类似.Ember类继承使用extend()方法,可以在方法传入参数,但是参数要以hash列表方式传入.关于类的命名规则在此不做介绍,自己网上找一份Java的命名规则的教材看看即可. 开始之前先做好准备工作,首先创建一个HTML文件,并引入Ember JS所必须的文件.由于博客不支持HTML标签输入,详细代码

C++ Primer 学习笔记_48_类与数据抽象 --类的定义和声明【下】

类 --类的定义和声明[下] 三.关于类定义的更多内容[接上] //P374 习题12.8 class Sales_item { public: double avg_price() const; bool same_isbn(const Sales_item &rhs) const { return rhs.isbn == isbn; } Sales_item():units_sold(0),revenue(0){} private: std::string isbn; unsigned un

字符串类的定义和字符串类对象的创建方式

String为字符串类. 其定义如下: public final class String 可以看出,String类是final类型的,是不可继承的.从源代码还可以看出,String从本质上说就是一个char类型的数组. 字符串类对象的声明有两种方式. 第一种,使用new关键字创建. String 变量名=new String("值"); 第二种,直接声明并初始化. String 变量名="值"; 我更喜欢第一种,标准的,所有类的对象的声明都通过  new 类的构造

JS类定义方式

// 方法1 对象直接量 var obj1 = { v1 : "", get_v1 : function() { return this.v1; }, set_v1 : function(v) { this.v1 = v; } }; obj1.set_v1('hello1'); alert(obj1.get_v1()); // 方法2 定义函数对象 var Obj = function() { var v1 = ""; this.get_v1 = function(