c++面向对象的特性:封装,继承,多态
封装
将属性和行为作为一个整体,表现生活中的事物,将属性和行为加以权限控制
语法:
class 类名{访问权限:属性/行为};
example:
class Circle{
//访问权限
public:
// 属性
int m_r
//行为
double calculateZC(){
rerurn 2*PI*m_r
}
}
//实例化:
Circle c1;
c1.m_r=10;
类中的属性和行为 我们统一称为成员
属性:成员属性 或者 成员变量
行为:成员函数 或者 成员方法
访问权限:
1.public //公共权限,成员类内可以访问,类外可以访问
2.protected //包含权限,类内可以访问,类外不可以访问 儿子可以访问父亲的
3.private //类内可以访问,类外不可以访问 儿子不可以访问父亲的
//example:
class Person{
public:
//公共权限
string m_name;
protected:
//包含权限
string m_car;
private:
//私有权限
int m_password;
public:
void func(){
n_name="张三";
m_car="拖拉机"
m_password="123456";
}
}
struct和class的区别:
c++中struct和class唯一的区别就是在于默认访问权限不一样
struct默认权限是public
class默认权限就是private
成员属性设置私有:
将所有成员属性设置为私有,可以自己控制写属性
example:
class Cube{
}
代码拆分:
#pragma once //防止头文件重复包含
头文件中只保留声明和属性不保留函数实现
二c.pp文件只保留函数实现部分,但是要在前面加类名::函数名 //意思就是在这个作用域中
构造函数
对象的初始化和清理
构造函数和析构函数:这两个函数编译器会自动调用,完成对象初始化和清理工作
因此如果我们不提供构造和析构,编译器会提供
编译器提供的构造函数和析构函数是空实现的
构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用
析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作
构造函数语法:类名(){}
1.构造函数没有返回值也不写void
2.函数名称和类型相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用对象的时候回自动调用构造,无须手动调用,而且只会调用一次
析构函数:~类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同在名称前加上符号~
3.析构函数不可以有参数,因此不可以发生重载
4.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
构造函数的分类及调用
两种分类方式:
按参数分类:有参构造和无参构造 //无参构造也叫默认构造
按类型分类:普通构造和拷贝构造 //
三种调用方式:
括号法
显示法
隐式转换法
class Person(){
public:
Person(){
cout<<"Person构造函数"<<endl;
}
Person(int a){
cout<<"Person的有参构造函数"<<endl;
age = a;
}
//拷贝构造函数
Person(const Person &p){
//将传入的人身上的所有属性,拷贝到我身上
age = p.age;
}
~Person(){
cout<<"Person析构函数"<<endl;
}
int age
}
//调用
void test01(){
//1.括号法
Person p1; //默认构造函数调用 //调用默认构造的时候,不可以加(),
//Person p1() //会被认为一个函数的声明,不会认为在创建对象
Person p2(10); //有参构造函数
Person p3(p2); //调用拷贝构造函数就是把别创建了放进去const Person &p
//2.显示法
Person p1;
Person p2=Person(10); //有参构造
Person p3=Person(p2); //拷贝构造
Person(10) //匿名对象 特点:当前执行结束后,系统会立即回收掉匿名对象
Person(p3) //拷贝匿名对象,不要写拷贝的匿名对象 Person (p3)==Person p3;
//2.隐式转换法
Person p4=10; //相当于Peson p4=Peson(10);
}
拷贝构造函数调用时机:
1.使用一个已经创建完毕的对象来初始化一个新对象
2.值传递的方式给函数参数传值
3.值方式返回局部对象
class Person{
public:
Person(){
cout<<"Person默认构造函数调用"<<endl;
}
Person(int age){
m_Age = age;
}
Person(Person &p){
}
~Person(){
}
}
void test01(){
Person p1(20);
Person p2(p1);
}
构造函数调用:
1.默认构造函数 //(空实现)
2.默认析构函数 //空实现
3.默认拷贝函数 //值拷贝
深拷贝和浅拷贝
浅拷贝:简单的赋值拷贝
深拷贝:在堆区重新申请空间,进行拷贝操作