空结构体
C语言中,空结构体的大小为0;
C++中,空结构体的大小为1
new和delete
#include<iostream>
using namespace std;
#include<assert.h>
int main()
{
int *q = new int(10); //指针q和指针p1是等价的
int *p1 = new int;
*p1 = 10;
int *p2 = new int[10]; //指针p2指向int[10]
memset(p2, 0, sizeof(int)*10);
for (int i = 0; i < 10; i++)
{
cout << *(p2+i) << " ";
}
cout << endl;
int **arr = new int*[10]; //指针arr是一个二级指针,arr指向一个指向int[10]的一级指针
for (int i = 0; i < 10; i++)
{
arr[i] = new int[10]; //给指针arr所指向的一级指针初始化,
memset(*(arr+i), 0, sizeof(int)* 10); //将以及指针所指的数组中的元素全部初始化为0
cout << *arr[i] << " ";
}
cout << endl;
for (int i = 0; i < 10; i++) //先释放掉一级指针的空间
{
delete []arr[i];
}
delete []arr; //再释放掉二级指针的空间
delete(q);
delete(p1);
//delete(p2);
delete[]p2;
return 0;
}
这是C++中的申请空间和释放空间
C++中的申请空间包括两个部分:
1.在堆上申请空间
2.再申请的空间上调用对象的构造函数
(这也是new和malloc的主要区别,是否调用构造函数)
其中:new分为
1.new() 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量
2.new[] 分配这种类型的n个大小的内存空间,并调用默认的构造函数来初始化这些变量
3.当时用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针,返回的类型保持了除最左边维数外的所有维数
int (*p)[10]=new int [2][10];
new了一个二维数组,去掉最左边的那一维[2],剩下int [10],所以返回的是一个指向int [10]这种一维数组的指针int(*)[10]
而C++中,new申请的空间,最后必须释放掉(delete)(这也是C++与C语言中申请空间的区别)
C++中释放空间也包括两个部分:
1.调用析构函数
2.释放空间
(这也是delete和free的主要区别,是否调用析造函数)
其中,delete分为:
1.delete a 删除单个对象
2.delete [] a 删除一个对象数组
new和malloc的区别
1.new是关键字,malloc是底层函数
2.new先申请内存,在调用构造函数
const(关键字)
1.常量和常变量
1. C语言中的const定义的是常变量,产生local符号,常变量不可以作为左值,运行时期寻址寻找值
2. C++常量不能被修改,可以作为数组的大小,不产生符号,编译期在使用常量的地方进行值的替换,所以可以用来开辟空间
3. 若在const定义的地方加上extern就会产生一个global的符号供其他文件使用,其他文件使用的是常变量
4. c++中const如果被初始化为一个变量的值,就退化成了常变量
5. c++中const作用域仅在本文件
6. c++中const必须初始化,如果不初始化就没法再赋值,如果类中有常成员变量,必须将其放在初始化列表
7. const修饰的类型是离他最近的完整类型
8. Typedef int* Pint const Pint a
9. 常量和常变量的作用域都在本文件中
define和const的区别
区别1
define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
const定义的常量,在程序运行时在常量表中,系统为它分配内存。
区别2
define定义的常量,预处理时只是直接进行了替换。所以编译时不能进行数据类型检验。
const定义的常量,在编译时进行严格的类型检验,可以避免出错。
区别3
define定义表达式时要注意“边缘效应”,例如如下定义:
#define N 2+3 //我们预想的N值是5,
我们这样使用N int a = N/2; //我们预想的a的值是2.5,可实际上a的值是3.5,
原因在于在预处理阶段,编译器将 a = N/2处理成了 a = 2+3/2;
这就是宏定义的字符串替换的“边缘效应”
因此要如下定义 #define N (2+3)
const定义表达式没有上述问题
const定义的常量叫做常变量原因有二:
1,const定义常量像变量一样检查类型。
2,const可以在任何地方定义常量,编译器对它的处理过程与变量相似,只是分配内存的地方不同(常量在静态区,变量在栈区)
引用
引用相当于别名,引用必须要赋初值,因为底层是一个常指针必须初始化,初始值必须可以取地址,如果引用不可寻址的量就要用从常引用,一经引用不可改变引用的方向,引用在使用的地方自动进行解引用,引用使用地方的汇编代码和指针解引用汇编码一样