C++复习(C和C++的区别2)

空结构体

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可以在任何地方定义常量,编译器对它的处理过程与变量相似,只是分配内存的地方不同(常量在静态区,变量在栈区)

引用

  引用相当于别名,引用必须要赋初值,因为底层是一个常指针必须初始化,初始值必须可以取地址,如果引用不可寻址的量就要用从常引用,一经引用不可改变引用的方向,引用在使用的地方自动进行解引用,引用使用地方的汇编代码和指针解引用汇编码一样

猜你喜欢

转载自blog.csdn.net/weixin_42736024/article/details/83317219
今日推荐