今天开始来复习一哈c++,虽然很早之前写qt就会了,但是太长时间不用就有点生疏了,类与对象之前的内容就不更新了,那个和c语言的常规用法很像,还是比较熟悉的。
1、什么是类与对象
什么是对象
对象是一个实体,我们眼睛看到的所有实体都可以看成一个实体对象
什么是类
类是用来对实体(对象)进行描述的。(对象有什么属性,有什么功能)类是一种自定义类型
什么是方法:
方法是实现类功能的一个具体实现,该类有什么样的功能?类的所有功能都要通过调用方法来实现。
自定义类型(类的关键字:class)
C中我们学过struct(结构体)自定义类型。c++为了兼容c语言,在这里我们也可以使用struct来定义类。和c不同的是,c++中的struct可以在内部放置函数,除此以外两者定义出的类还有其他的的区别。
class 类名//或者struct 类名
{
//类体:成员变量--属性 成员函数---功能
};
类的特性
访问权限以及访问限定符
访问权限概念:控制哪些成员可以在类外直接被访问,哪些只能通过方法进行访问
类与对象 三大特性,封装、继承、多态
public ,成员,类内都可以访问,类外能访问
private 成员,类内都可以访问,类外不能访问,儿子不可访问父亲
protected 成员,类内都可以访问,类外不能问,继承那边用 儿子可访问父亲
struct 定义的类和class定义的类的区别:
struct定义的类:成员默认的访问权限是public
class定义的类:成员默认的访问权限是private
2、三种默认函数
类的六个默认成员函数(这次只介绍三种)
默认成员函数的概念:
用户自己没有写,编译器会自动生成;一旦用户显式定义,编译器便不再生成。
构造函数
构造函数是特殊的成员函数,名字与类名相同,创建对象时由编译器自动调用,以保证每个数据都能有一个合适的初始值,并且在对象整个生命周期只调用一次。
构造函数的主要任务不是开辟空间创建对象,而是初始化对象。
对象的创建,如果是一个临时变量则编译器会在在栈上为其开辟空间,如果是一个动态存储变量则会通过malloc或者new(C++的动态管理操作符)在堆上开辟空间。(下一篇会进行讲解new)
构造函数的特性
1.构造函数名与类名相同
2.构造函数为无返回值类型,也不写void
3.对象实例化时编译器自动调用相对应的构造函数
4.构造函数支持函数重载,构造函数可以有参数
6.编译器自动生成的默认构造函数是一个无参的默认函数。函数体内什么都没有。
如果类类型包含其他的类成员对象,编译器就会生成默认的构造函数对自定义类型成员调用它的默认成员函数。
class person{
public:
person(){
cout<<"person的构造函数"<<endl;
}
person(int a){
age=a;
cout<<"person的有参数构造函数: "<<age<<endl;
}
~person(){//只会在对象结束以后,销毁了才会调用
cout<<"person的析构函数"<<endl;
}
private:
int age;
}
析构函数
析构函数概念:
析构函数与构造函数相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
析构函数特性
1.析构函数时在类名前加上字符~
2.析构函数无参数吴返回值类型
3.析构函数不能重载
4.一个类只能有一个析构函数,若为显式定义,系统会自动调用默认的析构函数
5.对象生命周期结束时,C++编译系统会自动调用析构函数。
class person{
public:
person(){
cout<<"person的构造函数"<<endl;
}
person(int a){
age=a;
cout<<"person的有参数构造函数: "<<age<<endl;
}
~person(){//只会在对象结束以后,销毁了才会调用
cout<<"person的析构函数"<<endl;
}
private:
int age;
}
拷贝构造函数
拷贝构造函数的概念
拷贝构造函数只有单个形参,该形参是对本类类型对象的引用。在用已存在的类类型创建对象创建新对象时由编译器自动调用
拷贝构造函数的特性
1.拷贝构造函数是构造函数的一个重载形式
2.拷贝构造函数的参数只有一个,且必须使用引用传参(传值将会进行无穷递归调用)
3.若未显式定义,系统会生成默认的拷贝构造函数。
4.用户(开发程序员)显式定义拷贝构造函数时都会把形参用const修饰,防止改动,增强代码的安全性
5.默认的拷贝构造函数对象按照内存存储,按字节序完成拷贝,这种拷贝就叫做浅拷贝。(关于浅拷贝和深拷贝的问题,我们后面再细说)
下面是全部的总结:
#include <iostream>
using namespace std;
//构造函数(初始化),析构函数(清理);编译器自动调用(空实现)
//作用:构造函数的最大作用就是创建对象时完成初始化,
/*
构造函数
构造函数:没有返回值,也不写void
函数名与类名一样
构造函数可以有参数,并且可以发生重载
程序在调用程序的时候自动调用,无需手动,且只会调用一次
*/
/*
析构函数
析构函数:没有返回值,也不写void
不能有参数
程序在调用程序的时候自动调用,无需手动,且只会调用一次
*/
class person{
public:
person(){ //析构写public里面
cout<<"person的构造函数"<<endl;
}
person(int a){
age=a;
cout<<"person的有参数构造函数: "<<age<<endl;
}
~person(){//只会在对象结束以后,销毁了才会调用
cout<<"person的析构函数"<<endl;
}
//拷贝构造函数
person(const person &per){//不能修改,引用方式来修改, //把传入的人身上的所有属性,拷贝到身上
age=per.age;
cout<<"person的拷贝构造函数: "<<age<<endl;
}
private:
int age;
};
void makeup(){//局部变量,函数结束完,就会释放,所以有析构函数调用
person p1;
person p2(12);
person p3(p2);
//显示法:
person p4=person(20); //显示法:有参构造
person p5=person(p2);//显示法,拷贝构造
person(8);//匿名对象(也会打印),特点:当前执行完(函数),系统立即回收掉匿名对象
//注意事项2
//但是不要用拷贝构造函数来,初始化匿名对象eg :person(p2);错误
//注意事项3
//隐私转换法
person p6=100; //相当于写了显示法
person p7=p6;
}
int main(){
makeup();//会调用析构,因为在栈区,makep()执行完了,会释放这个对象
return 0;
}
此外,我用的是clion写C++,需要安装包和配置环境变量的朋友可以私我