第一次写文章,感觉好奇怪。
初学C++,用刚学的类写个小程序
主要问题:
1.需要根据输入确定矩阵大小,所以需要用new给类的私有成员申请空间。同时如何创建二维数组,且如何传递,主要是二维数组的类型。
2.初始化构造函数、赋值构造函数和重载=之间的联系。
3.VScode怎么同时编译多个文件。
一、new与二维数组
1.数据类型:首先看一维数组,想传地址直接取数组名就好,比如:
int
那么照这么搞,二维数组的地址是不是可以表示成 int **p? 很遗憾不能。和C一样,C++按行分配内存块,所以编译器可以不知道你要多少行,但是必须要知道你每行的长度是多少,不然没法分配内存。一个3X2数组的地址:
![b033d34ae1af98497b369c1e2116515c.png](https://i-blog.csdnimg.cn/blog_migrate/05c4cd1110bc625ddffc4c391e168244.png)
所以对于一个二维数组,它的数组名(地址)的数据类型实际上是 (int (*)[n]),其中n是列数,也就是说,不同列数的数组他们的数组地址不是同一种类型的,他们不能混用!尽管我们可以用 a[i][j] = *(a[i] + j) = *(*(a+i)+j) 表示二维数组, 但让 int **p=a,是一定会报错的,因为尽管a和p似乎都是 指向 int的指针 的指针,但是前者在定义二维数组之后使用,编译器知道它是一个列数为n的二维数组的地址,而后者只是一个Int被指了两边,所以当你试图用p去接a的值时(比如函数形参),编译器会提示类型错误。
那如果x还想用指针传递二维数组该怎么办呢,其实很简单,这要告诉编译器“这不仅是一个指针,而且你需要按n列的二维数组去读取它“就行了。直接强转:
void
这样就能正常n将temp当s二维数组用了。这里之所以能在列数处用变量是因为语句只是说明了声明和转换类型,并没有去申请长为n的内存空间。
2.用new分配二维数组内存。
当然这时我们已经根据输入知道了到底要分配多少列了
一种流行的写法是:(单独申请每一行,地址是不连续的)
double
但我们根据前面的描述不难想到:
int
这样的一个好处是内存是连续的:(虽然好像没什么用)
![c28a996c3d598189e27503cb954e5f49.png](https://i-blog.csdnimg.cn/blog_migrate/28fa50121d6ece7f64daf9728a76bf8c.png)
当然你也可以用强转把new申请的内存地址转了,然后用你喜欢的表示方法把数取出来(比如两次一维数组),总之地址在那数据空间也在那。
二、构造函数、赋值构造函数和重载“=”
我定义了:
class
当使用类似
Matrix ANS=mat1*mat2 时:
对mat1、mat2应用重载乘法 ->【复制(先默认构造)得到的结果】->使用重载=赋值给左边的量(先默认构造)
【】中的可能由于类的实现过程已经进行了复制,所以可能没有。
但就算表达式再简单,这些基本构造函数还是都该写成deepcopy的,不然如果用重载的话,指不定C++在哪给你临时调用一个,然后删除的时候就会重复删除。然后就是注意返回引用的话不能返回临时变量。
三、VScode 多文件编译
之前用弟弟Keil的时候只会点build all,这下得学怎么cmake了
建议百度看这个cmake_tutorial
刚学也不会啥骚操作,反正能编译出来就行了:
project