C++ 动态对象数组的知识总结
来源:互联网 发布:空气污染指数的算法 编辑:程序博客网 时间:2024/06/01 09:50
默认构造函数
首先,我们来看一下是什么是默认构造函数,如下面一段代码:
#include<iostream>#include<math.h>using namespace std;class Point{ double x, y;public: void print(); Point(double a=0,double b=1){x=a;y=b;} //默认构造函数 Point(double a){x=1;y=1;} //构造函数 Point(){} //默认构造函数};void Point::print(){ cout << x << " " << y << endl;}
所以,可以知道默认构造函数总得来说是可以在对象生成的时候,不需要传入参数,对应情况就是:
Point point; Point *point=new Point;
非默认构造函数就是必须要传参。关于默认构造函数有以下知识点:
- 程序没有定义任何构造函数,则有默认的构造函数Point(){},里面的成员的值没有初始化
- 定义默认构造函数有两种方式,如上述代码展示的,一是定义一个无参的构造函数,二是定义所有参数都有默认值的构造函数
- 注意:一个类只能有一个默认构造函数!也就是说上述两种方式不能同时出现,一般选择 Point(); 这种形式的默认构造函数
带默认构造函数的动态数组
我们来看一下如果一个类带默认构造函数,如下代码是生成静态和动态数组的:
#include<iostream>#include<math.h>using namespace std;class Point{ double x, y;public: void print();};void Point::print(){ cout << x << " " << y << endl;}int main() { //静态对象数组 Point pp[5]; for (int i = 0; i<5; i++) pp[i].print(); //动态对象数组 Point *p = new Point[5]; //这里面5也可以是变量 for (int i = 0; i<5; i++) p[i].print(); //别忘记delete相应的空间}
可以看出来,如果一个类带默认构造函数的话,那么生成的时候就不需要传入参数了,方便了不少。
没有默认构造函数的动态数组
如果一个类没有默认构造函数呢,这种情况就需要传入参数了,如下代码:
#include<iostream>#include<math.h>using namespace std;class Point{ double x, y;public: Point(double a, double b); void print();};Point::Point(double a, double b){ x = a; y = b;}void Point::print(){ cout << x << " " << y << endl;}int main(){ Point *p[5];//静态指针数组 for (int i = 0; i < 5; i++) { p[i] = new Point(i, i); //其中你可以用自己的方式来初始化对象,例如从键盘接收值等 } for (int i = 0; i < 5; i++) { p[i]->print(); } Point **pp = new Point *[5]; //动态指针数组,5也可以是变量 for (int i = 0; i < 5; i++) { pp[i] = new Point(i, i); } for (int i = 0; i < 5; i++) { pp[i]->print(); } //别忘了delete相应的空间 return 0;}
静态指针数组是定义了一些的Point
指针,通过new的方式来使每个指针指向对象。动态指针数组是分配固定大小的连续空间,里面的每个元素类型是Point *
,然后把这连续空间的首地址给pp,pp是指向Point *类型的指针。
注意是 new Point *[5]而不是 new (Point *)[5],后者编译器会报错
new多维数组
int *p=new int[2];int *p=new int[2][3]; //错误int (*p)[3]=new int[2][3]; //正确int (*p)[4][5]=new int[2][4][5]; //正确
为啥第二行就错误呢?其实我们可以这样理解:
- int (*p)[3]其中p是指针,这是毋庸置疑的,那这个指针指向什么类的数据呢?我们改一下写法,编程int[3] (*p),是不是就很简洁明了呢?p指向的类型是int[3]。
- new int[2][3]返回的2个int[3]类型的数组的首地址,赋值给p。
- 同理,第四行p指向的类型是int[4][5],new int[3][4][5]返回的是3个int[4][5]类型的数组的首地址,赋值给p。
- 针对第一行的情况,如果p的一开始地址为1000,假设int占用4个字节,那么执行p++以后,p的地址为1000+4,第三行的情况,如果p的一开始地址为1000,进行p++以后,p的请值为1000+4*3,以此类推,第四行p++以后p的值为1000+4*4*5。
阅读全文
4 0
- C++ 动态对象数组的知识总结
- C++ -Vector动态数组知识总结
- C语言的数组、字符串等一些知识总结
- 总结数组的相关知识
- C---指针与数组知识总结
- 动态数组的 C 实现
- [C] 在 C 语言编程中实现动态数组对象
- 类和对象的知识总结
- object-c中数组的某些知识
- C语言指针和数组知识总结(上)
- C语言指针和数组知识总结(下)
- 动态内存知识总结
- 【黑马程序员】---Objective-C面向对象知识总结
- C语言实现动态数组(以面向对象的编程风格)
- Java知识总结-数组
- 数组知识总结
- 数组相关知识总结
- 面向对象知识总结
- JDK以及eclipse
- java找出一个数组中出现次数最多的那个元素(用HashSet很新颖)
- 「视频直播技术详解」系列之五:延迟优化
- 以文开头
- 使用记事本敲出的Java坦克大战案例
- C++ 动态对象数组的知识总结
- 《数字技术》连载15: 第2章 数字器件 第10节 D 触发器
- siebel基础配置
- 【Java】继承、抽象、接口和包
- Leetcode:48. Rotate Image(数组选择90度)
- HorizontalScrollView的基础实现
- factory方式定义服务
- jackson fasterxml 的api地址
- 数据库客户端DataGrip使用中遇到的问题