C++阶段小结(二)
;
const A *p;
p = &a1;//指针可以改变
//p->x = 23;错,常对象指针指向的对象中的内容不可以改变
p = &a2;
}
void f3() {
A a1;A a2;
const A * const p = &a1;//常对象常指针,指针和对象均不可改变
//p = &a2; 错
//p->x = 34; 错
}
十一、常成员变量和常成员函数以及常对象
常成员变量时用关键字const来修饰声明的成员变量,const位于变量前或者类型前都一样。例如
class Time{
public:
const int hour;
int const minute;
}
1. 常成员变量只能通过构造函数的初始化表对常成员变量进行初始化;
例如.
class A {
public:
//常成员变量
const int x;
const int y;
int z;
A(int x, int y);
A(int x, int y, int z);
};
A::A(int x, int y): x(x),y(y) {
}
A::A(int x, int y, int z): x(x),y(y) {
this->z = z;
}
2. 常成员变量所在类中所有的构造函数都必须通过初始化表对常成员进行初始化;
3. 常成员变量可以向普通的成员变量一样进行访问,但是其值是不能被修改的。
4. 必须在构造函数初始化,不然为随机数没有意义
常成员函数:用const修饰的成员函数,const位于函数括号之后,定义和声明的地方都要加上const。
例如
class Time{
public:
void show()const;
}
常成员函数可以用this访问成员变量,但是不能修改this访问的成员变量。(包括常成员变量和非常成员变量)
常成员函数体重用this访问成员函数时,只能访问常成员函数(常成员函数只能访问常成员函数)
例如
class A {
public:
int x;
//常成员函数
void m1()const;
void m2()const;
void m3();
void m4();
};
void A::m1()const {
cout<x<
//常成员函数不能修饰成员变量
//this->x = 234;//错
this->m2();
//常成员函数只能访问成常函数,但是不能访问普通的成员函数
//任函数都可以访问常成员函数
//this->m3();//错
}
void A::m2()const {
this->m1();
}
void A::m3() {
this->x = 234;
}
void A::m4() {
this->m1();
}
常对象
定义常对象形式为
类名 const 对象名(实参列表);或者const 类名 对象名(实参列表);
例:
class Time{
public:
Time();
Time(int x);
……
}
const Time time1;
Time const time2;
const Time time3(100);
Time const time4(200);
常对象特点:
1. 常对象中所有的成员变量的值都不能够被修改;
2. 常对象访问函数时只能访问常成员函数;
例:
class A {
public:
int x;
int y;
A();
void m1()const;
void m2();
};
A::A():x(10),y(23) {
}//初始化表初始化成员变量
void A::m1()const {
cout<<"A::m1();"<
}
void A::m2() {
cout<<"A::m2();"<
}
void f2() {
const A a;//常对象
cout<
cout<
//常对象中成员变量的值不能修改,只能在构
//构函数中用初始化表初始化
//a.x = 23;//错
a.m1();
//a.m2();错
//常对象只能访问常成员函数
}
int main() {
f2();
return 0;}
十二、对象动态创建与销毁
new运算符可以动态创建对象,创建对象后会返回对象的地址。如果内存不足导致无法成功创建对象,则会返回0指针值。
动态创建的对象要用“delete 对象指针”才能销毁对象。
BOX *pt1;
pt=new BOX;//创建对象
delete pt1;//销毁对象
如果是用malloca和free动态创建和释放对象的话不会调用构造函数和析构函数,所以一般在C++中是采用new和delete来动态创建和销毁对象的。
十三、对象的复制与赋值
对象赋值方法:
类名 对象1(对象2);
对象赋值的方法:
对象名1=对象名2;
类名 对象名1=对象名2;
例:
//赋值
void f1() {
Stu stu1,stu2;
stu1.age = 20;
stu1.no = 100;
stu2 = stu1;
stu1.show("stu1");
stu2.show("stu2");
Stu stu3 = stu1;
stu3.show("stu3");
}
//复制
void f2() {
Stu stu1;
stu1.age = 20;
stu1.no = 100;
Stu stu2(stu1);//本质是调用了类的复制构造函数
stu2.show("stu2");
}
1.如果自定义了非复制构造函数,类中有一个默认的复制构造函数
2.如果没有自定义构造函数,类中默认有两个构造函数,一个无参的,
另一个是复制构造函数
3.如果是自定义了复制构造函数,类中就一个默认的构造函数都没有了
4.复制构造函数就是:写一个参数为 "类的引用" 的构函数,与函数体无关
十三、静态成员(static)
静态成员变量
如果想在同类的多个对象之间实现数据共享,可以用静态成员变量,即用static修饰的成员变量,例如static int a;
静态成员变量在项目刚开始运行的时候就分配 ,在项目运行结束以后才销毁。
静态成员变量被它所属类创建的所有对象所共享。
静态成员变量必须在类体外初始化。建议放在main函数所在的文件中,格式为:
成员变量数据类型 类名::静态成员变量=初值
例如 int Stu::a=20;
访问静态成员变量有两种方式:
1. 与普通成员变量一样,可以通过对象、对象指针或对象引用来访问
2. 用静态成员变量所属类的类名加双冒号来访问,这种方式只能够访问静态成员变量,即
类名::静态成员变量
class Stu{
public:
static int a;
}
int Stu::a=10;//类名双冒号访问变量
void f1() {