c++教程三:类和对象

160 阅读4分钟

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";
    }
}

structclass的区别:
c++中structclass唯一的区别就是在于默认访问权限不一样
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.默认拷贝函数	//值拷贝

深拷贝和浅拷贝
浅拷贝:简单的赋值拷贝
深拷贝:在堆区重新申请空间,进行拷贝操作