文章目录

  • 一、类成员对象
    • 1、类的对象
    • 2、具体参考代码
  • 二、动态对象与new、delete
    • 1、C语言中为类的对象开辟动态空间
    • 2、C++的new开辟动态空间:类型名 *p= new 类型名
    • 3、请自定义类的动态空间,p3是一个对象指针
    • 4、申请数组的动态空间,p4是一个数组
    • 5、C++申请动态空间完整练习代码
  • 三、动态对象(传参)

一、类成员对象

1、类的对象

简单来说,类成员对象就是在类中定义其他类的实例化对象,并调用其他的成员对象的有参/无参构造函数。

例如:
定义三个Room、Chair、Person,
然后在Person类的定义中,
再定义Room、Chair的实例化对象room和chair,
定义Person对象传入3个有参构造函数需要的参数,
并通过room、chair这两个对象对它们的成员数据进行赋值,
同时在Person类中引用room、chair对象的数据进行输出。

2、具体参考代码

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;//定义一个房间类
class Room
{public:string room_name;  //定义一个共有成员,字符串类型的名字//定义有参构造函数Room(string name){room_name= name;cout << "此为Room的构造函数" << endl;} ~Room(){cout << "This is Room function done..." << endl;}
};//再定义一个椅子类
class Chair
{public:string chair_name;  //定义一个共有成员,字符串类型的名字  //定义有参构造函数Chair(string name){chair_name= name;cout << "此为Chair的构造函数" << endl;} ~Chair(){cout << "This is Chair function done..." << endl;}
};//定义一个人的类
class Person
{public://定义有参构造函数//不能直接这样写调用其他类对象的有参构造 /*Person(string p_name, string r_name, string c_name){//对Person的成员进行赋值per_name= p_name;room.room_name= r_name;chair.chair_name= c_name; } *///必须使用初始化列表,才可以调用其他类对象的有参构造Person(string p_name, string r_name, string c_name):per_name(p_name), room(r_name), chair(c_name){ cout << "此为Person的构造函数" << endl;}//定义析构函数 ~Person(){cout << "This is Person function done..." << endl;}string per_name;  //定义一个共有成员,字符串类型的名字 //该类的成员中包含两个其他类的对象Room room;  //定义一个Room类的对象room,也就是让一个类的对象作为另一个类的成员 Chair chair;  //定义一个Chair类的对象chair//定义Person的成员函数,输出Person的3个成员数据 void show(){cout << per_name << room.room_name << chair.chair_name << endl;}
};int main()
{//实例化Person对象,传入三个参数Person p1("Chung", "在520房间", "的椅子上。");p1.show();return 0;
}

二、动态对象与new、delete

1、C语言中为类的对象开辟动态空间

//假如已经定义了一个Box类,则在C语言中如下开辟动态空间:
void test01()
{//用malloc申请一段动态内存空间 Box *p= (Box*)malloc(sizeof(Box));    //空间大小为类Box的大小 free(p);  //使用完了释放内存空间
}

2、C++的new开辟动态空间:类型名 *p= new 类型名

在C++语言中申请普通类型的动态空间:类型名 *p= new 类型名,p2是一个指针 :

void test02()
{//申请一段int类型的空间并赋值给p2指针,大小为sizeof(int) int *p2= new int;  *p2= 99;cout << "*p2= " << *p2 << endl;delete p2;  //使用完了释放内存空间
}

3、请自定义类的动态空间,p3是一个对象指针

void test03()
{//申请一段Box类型的空间并赋值给p3指针,大小为sizeof(Box) Box *p3= new Box; (*p3).a= 666;cout << "p3对象中的a= " << (*p3).a << endl;delete p3;  //使用完了释放内存空间
}

4、申请数组的动态空间,p4是一个数组

void test04()
{int *p4= new int[10];  //申请一段int数组类型的空间,大小为sizeof(int[10]),实际上该指针指向的是数组元素的首地址 //给数组元素赋值for(int i=0; i<10; i++){p4[i]= i+10;} //输出数组元素的值 for(int i=0; i<10; i++){cout << p4[i] << " ";} cout << endl;//释放内存空间,不能直接delete p4;  这样只是释放了首元素的空间delete []p4;
}

5、C++申请动态空间完整练习代码

#include <iostream>
#include <string.h>
#include <stdlib.h>  //需要用到malloc
using namespace std;//定义一个盒子类
class Box
{public:Box()  //定义构造函数 {cout << "Box的无参构造" << endl;}~Box()  //定义析构函数 {cout << "Box的析构函数" << endl;}int a;  //私有成员数据
};//在C语言中动态申请空间
void test01()
{//用malloc申请一段动态内存空间 Box *p= (Box*)malloc(sizeof(Box));    //空间大小为类Box的大小 free(p);  //使用完了释放内存空间
} //在C++语言中申请普通类型的动态空间:类型名 *p= new 类型名,p2是一个指针
void test02()
{//申请一段int类型的空间并赋值给p2指针,大小为sizeof(int) int *p2= new int;  *p2= 99;cout << "*p2= " << *p2 << endl;delete p2;  //使用完了释放内存空间
} //在C++语言中申请自定义类的动态空间,p3是一个对象指针
void test03()
{//申请一段Box类型的空间并赋值给p3指针,大小为sizeof(Box) Box *p3= new Box; (*p3).a= 666;cout << "p3对象中的a= " << (*p3).a << endl;delete p3;  //使用完了释放内存空间
} //在C++语言中申请数组的动态空间,p4是一个数组
void test04()
{int *p4= new int[10];  //申请一段int数组类型的空间,大小为sizeof(int[10]),实际上该指针指向的是数组元素的首地址 //给数组元素赋值for(int i=0; i<10; i++){p4[i]= i+10;} //输出数组元素的值 for(int i=0; i<10; i++){cout << p4[i] << " ";} cout << endl;//释放内存空间,不能直接delete p4;  这样只是释放了首元素的空间delete []p4;
}int main()
{//test01();//test02();test03();test04();return 0;
}

三、动态对象(传参)

与上文动态空间的申请同理,只是需要传入参数。
注意:若申请的是对象数组,则不能实例化带有参数构造函数的类,只能是无参构造函数类。

#include <iostream>
#include <string.h>
#include <stdlib.h>  //需要用到malloc
using namespace std;//定义一个盒子类
class Box
{public:Box()  //定义构造函数 {cout << "Box的无参构造" << endl;}//使用初始化列表定义有参构造函数Box(int h, int w, int len):height(h), width(w), length(len)   {cout << "Box的有参构造" << endl;}~Box()  //定义析构函数 {cout << "Box的析构函数" << endl;}
private:int height;  //私有成员数据 int width;int length;
};//定义测试函数
void test()
{//申请一段Box类型的动态空间并赋值给p指针,大小为sizeof(Box)//并传入构造函数的参数 Box *p= new Box(1, 2, 3);   delete p;  //释放申请的内存空间 // //申请动态空间,调用无参构造的对象数组 cout << "-------------------------"  << endl; Box *p2= new Box[5];   delete []p2;  //释放对象数组的内存空间
} int main()
{test();
}

C++类对象成员、动态对象、new、delete运算符申请动态空间(C++初学面向对象)相关推荐

  1. 【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )

    文章目录 一.使用 对象名.成员名 访问 Groovy 类的成员 二.使用 对象名.'成员名' 访问 Groovy 类的成员 三.使用 对象名['成员名'] 访问 Groovy 类的成员 四.完整代码 ...

  2. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数

    首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...

  3. C++经典问题:如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B?

    对象成员特点总结: (1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数. (2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的 ...

  4. c++学习——(6)数组对象与对象成员

    一.对象数组 1.对象数组的实例化 图中有两种实例化方法,前一个是在栈上,后一个是在堆上. 2.两种实例化方式的区别 在栈区实例化数组:在栈区实例化数组,由系统自动分配内存空间,并自动回收. 在堆上实 ...

  5. 【Groovy】Groovy 方法调用 ( 使用 对象名.@成员名 访问 Groovy 对象成员 )

    文章目录 一.使用 对象名.@成员名 访问 Groovy 对象成员 二.完整代码示例 一.使用 对象名.@成员名 访问 Groovy 对象成员 针对 Groovy 中的类 , class Studen ...

  6. 9.0 C++远征:对象成员

    2-5对象成员 1.一个对象作为另一个对象的数据成员,称为"对象成员" 2.对象成员的创建次序: ​ 先创建成员对象,再创建包含着成员对象的对象. 3.对象成员的销毁次序: ​ 先 ...

  7. ES6新语法--对象成员简写、对象展开、数组展开

    对象成员简写 /*** 对象成员简写*///声明变量 let name = 'chen'; let age = 18; let gender = 'man'; let score = 100;//声明 ...

  8. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  9. c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性

    本文包含以下内容 1. C++的四类特殊成员函数介绍,重点介绍拷贝构造函数和拷贝复制运算符 2. C++11中的default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https:/ ...

最新文章

  1. share_ptr_c++11
  2. 高校新校园网络系统设计方案
  3. java同一包protect_Java基础知识 - 欢迎来到夜故事,一个人的故事 - OSCHINA - 中文开源技术交流社区...
  4. 使用ulimit设置文件最大打开数
  5. 年报统计系统—基本信息模块的目标文档
  6. CodeForces - 451A - Game With Sticks(博弈论)
  7. linux和GNU之间的关系
  8. IE与Firefox的CSS兼容大全~~论坛推荐~!!!
  9. 【正则化】各种Dropout方法
  10. win10 uwp 如何判断一个对象被移除
  11. convert oracle 字符串_oracle的concat、convert、listagg函数(字符串拼接和类型转换)...
  12. java完成crm系统ppt,客户关系管理系统答辩稿.ppt
  13. 谈谈蛋疼的问题:里式替换原则:正方形是长方形吗?
  14. 魔兽和星际最大差别是什么?
  15. JAVA字符串格式化-String.format()的使用总结
  16. Java实现DES加密解密(对称式)
  17. 2023年全国最新机动车签字授权人精选真题及答案10
  18. 手机端网页尺寸html,手机端网页设计尺寸_html/css_WEB-ITnose
  19. 微信小程序复用公众号资质快速认证
  20. Linux与Fedora

热门文章

  1. 生日在java中怎么写_如何用java写代码:输入自己的生日,距离今天已过多少天,或者还有...
  2. 前缀表达式后缀表达式_你知道波兰表达式和逆波兰表达式吗
  3. Eclipse修改项目编码
  4. Adob Flash Professional CS6发布Android手机应用报异常
  5. dispay的flex属性
  6. python计算两字符串中的位置_从Python中的字符串中获取两个字符
  7. constraintlayout_androidApi:ConstraintLayout
  8. python3 运行you get_一个基于Python3的神奇插件——you-get
  9. qmenu基本用法_使用QProxyStyle定制QMenu (二)
  10. vant按需引入_VueCli2 配置Vant主题