新星计划期末复习c++知识点大回顾,八篇文章让你永不破防(建议收藏)
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新星计划期末复习c++知识点大回顾,八篇文章让你永不破防(建议收藏)相关的知识,希望对你有一定的参考价值。
目录总览
目录
三、再谈构造函数和析构函数
1.调用构造和析构函数的顺序
- 调用构造函数的顺序和调用析构函数的顺序相反
- 调用构造函数时,先基类调用,再到派生类
- 调用析构函数时,先派生类调用,再基类调用
非常类似栈的结构,可以类比进行记忆🙂
当出现子对象(组合类)(对象里面的成员变量还有对象类型)时,构造函数执行的顺序为:
可以看下面的图:
简单代码样例:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
class student
{
public:
student(){cout<<"student构造函数1\\n";}
~student(){cout<<"student析构函数1\\n";}
};
class teacher:public student
{
public:
teacher(){cout<<"teacher构造函数2\\n";}
~teacher(){cout<<"teacher析构函数2\\n";}
};
class boss:public teacher,public student
{
public:
boss(){cout<<"boss构造函数3\\n";}
~boss(){cout<<"boss析构函数3\\n";}
};
int main()
{
boss b;
return 0;
}
结果:
总结:全局或静态对象的析构函数调用顺序与他们建立顺序(构造函数调用的顺序)相反。
2.对象的赋值
如果一个类定义了多个对象时,则这些同类的对象之间可以互相赋值,即将一个对象中所有数据成员的值一一赋给另一个同类对象的对应成员。
对象之间的赋值也是通过赋值运算符“=”进行的。
对象赋值的一般形式为
对象名1 = 对象名2;
【例】
student stu1,stu2;//定义两个同类的对象
stu1 = stu2; // 将一个对象的所有数据成员赋给另一个对象的所有数据成员
注意:
① 对象名1和对象名2必须属于同一个类
② 对象的赋值只对其中的数据成员赋值,而不对成员函数赋值
③ 类的数据成员中不能包括动态分配的数据,否则在赋值时可能出现严重后果
3.对象的复制😊
如果需要用到多个完全相同的对象,或将对象在某一瞬时的状态保留下来,可使用对象的复制机制,即用一个已有的对象快速地复制出多个完全相同的对象。
- 对象复制实际上是在建立对象时调用一个特殊的构造函数,即复制构造函数(拷贝构造函数)
- 它的作用就是 将实参对象的各成员值一一赋给新的对象中对应的成员。
- 复制构造函数也是构造函数,但它只有一个参数,这个参数必须是本类的对象,而且采用对象的引用的形式(一定是引用)。比如下面以myclass类为例:复制构造函数就是:
myclass(myclass &);
注意:
- 调用复制构造函数参数只有一个,且类型为同种对象的引用类型。
- 若用户未定义复制构造函数,系统会自动提供一个默认的复制构造函数,用来复制每个数据成员。
对象复制的形式有:
1.类名 对象2(对象1);
2.类名 对象名1 = 对象名2;
Box box2=box1; //用box1初始化box2
//或Box box2(box1);
复制与赋值的区别:
对象的赋值是对一个已经存在的对象赋值,而对象的复制则是从无到有地建立一个新对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值)。
赋值强调已经存在对象,赋值强调重新创建。
4.对象数组
数组中每个元素的类型都为对象类型,创建对象数组类型时每个对象都会调用其自己的构造函数。
student stu[20];//创建一个student对象数组,大小为20,每个元素都为student对象类型
不同参数数目的初始化:
一个参数时:
可以在等号后面的花括号里面提供相同数目(和数组长度一样)的实参
student stu[3] = {1,2,3};//student参数数目为一个
多个参数时:
需要在花括号里面调用构造函数,在构造函数里面提供实参。
//以两个参数为例
student stu[2] = {student(1,2),student(2,3)};
//创建长度为2的对象数组
5.对象指针
5.1.指向对象的指针
声明形式:
类名 *对象指针名
例:加入已经定义一个student类
student *sptr;
student s;
sptr = &s;//将s的初始地址赋给sptr
通过对象指针访问对象成员:
*指针变量 | 指针变量所指向的对象 |
(*指针变量).成员变量 | 指针变量所指向的对象中的成员变量 |
指针变量->成员变量 | 指针变量所指向的对象中的成员变量 |
(*指针变量).成员函数 | 调用指针变量所指向的对象中的成员函数 |
指针变量->成员函数 | 调用指针变量所指向的对象中的成员函数 |
5.2.指向对象成员的指针
1.指向对象数据成员的指针:
形式:
数据类型名 *指针变量名;
例:假设已经定义student类,其中有age数据成员,下面定义指向age的指针。
student s(16);
int *p;
p = &s.age;
cout<<*p<<endl;//输出age
2.指向对象成员函数的指针
形式:
数据类型名 (类名∷*指针变量名)(参数表列);
编译系统要求指针变量的类型必须在下面3个方面与函数的类型相匹配:
①函数参数的类型和参数个数;
②函数返回值的类型;
③所属的类。
使指针变量指向一个公用成员函数的一般形式为
指针变量名=&类名∷成员函数名;
#include <iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);
int hour;
int minute;
int sec;
void get_time( ); //声明公有成员函数
};
Time::Time(int h,int m,int s)//构造函数
{
hour=h;
minute=m;
sec=s;
}
void Time::get_time( ) //定义公有成员函数
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
int main( )
{
Time t1(10,11,12);
int *p1=&t1.hour;
cout<<*p1<<endl;
t1.get_time( );
Time *p2=&t1;
p2->get_time( );
void (Time::*p3)( ); //定义p3为指向Time一个公有成员函数的指针变量
p3=&Time::get_time; //将p3赋为Time的get_time地址
(t1.*p3)( );
return 0;
}
结果:
10
10:11:12
10:11:12
10:11:12
以上是关于新星计划期末复习c++知识点大回顾,八篇文章让你永不破防(建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章
期末复习c++知识点大回顾,八篇文章让你永不破防(建议收藏)
期末复习c++知识点大回顾,八篇文章让你永不破防(建议收藏)
期末复习c++知识点大回顾,八篇文章让你永不破防(建议收藏)