前言
本博客旨在记录C++学习过程中的一些细节知识理解,由于问题的产生并非成体系,所以前期的记录可能会无序一些。烦请读者参阅目录进行快速的问题定位与跳转
C++基础与细节理解
- 前言
- 正文部分
- C++基础:为什么new的时候要使用指针接收?
- C++基础:如何优雅地用指针指向数组
正文部分
C++基础:为什么new的时候要使用指针接收?
我们经常注意到,在C++编程中,以下两种创建对象的形式是最为常见的:
QPushButton *button1 = new QPushButton("示例1");
QPushButton button2("示例2");
我们知道,方式一将对象创建在堆中,并通过button1指向对象;方式二则是将对象创建在栈上,button2直接表示对象
为什么要这么做?这都是出于更健全的内存维护考虑:
- 方式一不允许使用非指针指向堆对象,是为了应用智能指针,在对象没有引用的时候,自主的回收对象分配的内存(否则需要显式的delete对象)
- 方式二由程序在对象作用域内自维护,内存仍是安全的
综上,在编程的时候,我们只推荐使用以上两种对象创建方式,并认为第二种要比第一种更优先(在对象占用内存较小时)
C++基础:如何优雅地用指针指向数组
在进行C++编程的时候,到底是选择一维指针还是二维指针指向某一个数组常常困扰着我们。其实有一个非常优雅的判断方式,那就是确保指针维度与数组维度是一致的
我们首先需要明确一个概念,左值=右值,在左值使用*或者[]用以提升维度,在右值使用*或者[]用以降低维度。通过调整确保左右维度一致的赋值就是语法合规的。
我们以三维数组为例,展示分别以一维指针和二维指针接收数组的形式:
int exampleArr[2][2][2] = {1,2,3,4,5,6};
//用一维数组来接收exampleArr[0]所指向的二维数组的第一个值,即exampleArr[0][0];
int *point1 = *exampleArr[0]; //等价于int *point1 = exampleArr[0][0]
//用二维数组来接收exampleArr[0]所指向的二维数组,即exampleArr[0];
int (*point2)[2] = exampleArr[0];