一、引用
1.从编译器的角度来讲:
引用就是一种升级版的指针。
2.从语法形式来讲:
引用是引用一块已经存在的合法空间
引用变量即是引用空间的变量的别名
指针可以是野指针,他可以指向任何的地方,如果在c++中单纯使用指针,很容易把程序写的不堪入目
指针可以进行无限次的赋值,引用只能被引用一次。
二、动态开辟空间
在c中:
int *pa=(int *)malloc (sizeof(int));//malloc在堆上开辟空间并没有进行初始化
int *pb=(int *)calloc(1,sizeof(int));//calloc 在堆上开辟空间是由初始化的
int *pc=(int *)realloc(pb,sizeof(int)*10);//relloc在堆上开辟空间都是有初始化的
free(pa);
若多次释放会造成doublefree,程序会异常中止
在c++中:new和delete
int *pa=new int;//使用new按类型直接开辟空间,不会初始化数值
int *pa=new int();//()中填写初始化的值,如果不写默认为0
若要动态开辟连续空间:
int *pb=new int[1024];
int *pb=new int[1024]{0};
delete pa;
delete []pb;
三、类中特殊属性的初始化
const修饰的成员对象、类类型对象(没有默认构造函数的对象)、static修饰的成员对象
1.c++中const修饰的变量,必须初始化。类中有自定义类类型(但这个类对象没有默认构造函数供其生成对象),也必须在开辟空间时,进行初始化。
cpp
#include <iostream>
using namespace std;
class A{
A(int a){//有参构造
}
};
class Stu
{
private:
string name;
int age;
const int id;
A a;
public:
// 初始化列表
// 初始化列表的调用时机:在构造函数调用之前
// 如果要全部使用初始化列表来完成对类中属性的初始化,需按照顺序
Stu(string name, int age, int id) : name(name), age(age), id(id),a(1)
{
cout << "Stu的有参构造" << endl;
}
void show(){
cout<<"学号:"<<this->id<<"姓名:"<<this->name<<"年龄:"<<this->age<<endl;
}
};
int main()
{
Stu stu("zhangsan",20,1001);
stu.show();
return 0;
}
2.类中static修饰的类中属性的初始化
cpp
#include <iostream>
using namespace std;
class A{
A(int a){//有参构造
}
};
class Stu
{
private:
string name;
int age;
const int id;
A a;
//静态变量必须在类外完成初始化才能在静态区中分配空间
//如果没有在类外进行初始化,那么它只是一个声明而已,没有空间
static int count;
public:
// 初始化列表的调用时机:在构造函数调用之前
// 如果要全部使用初始化列表来完成对类中属性的初始化,需按照顺序
Stu(string name, int age, int id) : name(name), age(age), id(id),a(1)
{
cout << "Stu的有参构造" << endl;
count++;
}
void show(){
cout<<"学号:"<<this->id<<"姓名:"<<this->name<<"年龄:"<<this->age<<endl;
}
};
//类外对static变量进行初始化
int Stu::count=0;
int main()
{
Stu stu("zhangsan",20,1001);
Stu stu1("lisi",30,1002);
stu.show();
stu1.show();
return 0;
}
类中静态属性,如果是public修饰的话,那么也可以直接使用域名访问符的形式直接访问,如Stu::count
并且static修饰的局部变量只能被初始化一次。