c++笔记第五天
类和对象
c++三大特性封装、继承、多态。
C++认为万物皆对象 有属性和行为
封装
1、将属性和行为作为一个整体,表现生活中的事物。
2、将属性和行为加以权限控制。
意义
在设计时属性和行为写在一起,表现事物。
格式
class 类名{访问权限:属性 / 行为};
1 const dobule PI=3.14; 2 class Circle 3 { 4 public://公共权限 5 //行为 6 int m_r; 7 //行为 8 //获取元的周长 9 dobule calculateZC() 10 { 11 return 2*PI*m_r 12 } 13 }; 14 Circle c1;//通过圆类创建具体对象 15 c1.m_r=10; 16 cout<<""圆的周长"<<c1.calculateZC( )<<endl;
封装访问权限
public 公共权限,类内可以访问 类外可以访问
proteced 保护权限,类内可以访问 类外不可以访问 子类可以访问继承类的权限
private 私有权限,类内可以访问,类外不可以访问 子类不可以访问据称的权限
c++中struct 和class唯一区别就在于默认的权限不同
1、struct默认权限为公共
2、class默认权限为私有
成员属性设置为私有,可以自己控制读写权限,对于写权限可以检测数据有效性
一个类中可以包含之前定义好的类的变量成员
#pragma once 仅包含一次用于多文件工程
类名::函数成员 告诉作用域 用于多文件中,头文件中
对象的初始化和清理
对象初始化由编译器调用构造函数实现,清理有系统调用析构函数清理数据。
构造函数语法: 类名(){}
1、构造函数没有返回值也不写void
2、函数名与类名相同
3、构造函数可以有参数,因此可以发生重载
4、程序在调用对象时会自动调用构造,无需手动调用且调用一次。
析构函数 ~类名(){}
1,析构函数没有返回值也不用写void
2、函数名与类名相同,在名称前加~
3、析构函数不可以有参数,因此不可以发生重载
4、程序在销毁对象时会自动调用析构,无需手动调用且调用一次。
构造函数分类和调用
参数:有参构造和无参构造;
按类型:普通构造和拷贝构造
拷贝构造函数写法
Persion(const Persion &p){}
调用
括号 --------->Persionp2(10);
显示法 -------> Persion p2=Persion(10)显示调用法
隐式转换法 -------> Persion p4=10 相当于写了Persion p4=Persion(10)
Persion(10) 叫做匿名对象,特点:当前执行结束后,系统立即回收匿名对象
注意:
1、调用默认构造函数时不要加().,因为编译器会认为是一个函数声明
2、不要利用拷贝构造函数初始化匿名对象;--------> Persion(p3) 编译器认为是一个对象声明重定义;
拷贝构造函数调用时机
1、使用一个已经创建完毕的对象来初始化一个新对象
2、值传递的方式给函数参数传值
3、以值方式返回局部对象
构造函数的调用规则
默认情况下c++编译器至少会添加3个函数
1、默认构造函数,无参,函数体为空
2、默认析构函数,无参,函数体为空
3、默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则
1、如果用户定义有参构造函数,c++编译器不提供默认无参构造,但是会提供默认拷贝构造
2、如果用户定义拷贝构造函数,c++编译器不会再提供其他构造函数。
深拷贝和浅拷贝
浅拷贝:简单的赋值操作;
深拷贝:在堆区新申请空间,进行拷贝
如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
构造函数初始化列表
C++提供了初始化列表语法,用来初始化属性
语法
构造函数():属性1(值1),属性2(值2)...{}
类对象作为类成员
c++类中的成员可以是另一个类的对象,称为该成员的对象成员;
class A{};
class B
{
A a;
};
在声明类变量时a的构造函数先以运行后在运行B的构造函数,当释放时先运行B的析构函数再运行A的析构函数。
静态成员
静态成员就是在成员变量和成员函数之前加上关键字static,
静态成员分为:
静态变量
1、所有对象共享同一份数据
2、在编译阶段分配内存
3、类内声明,类外初始化 ,必须做的操作
1 class A 2 { 3 static int m_ A;//类内声明 4 }; 5 int a::m_A=100;//类外初始化 6 //此时m_A可通过对象访问如: 7 // A p1; 8 // p1.m_A; 9 //也可以用通过类名访问,即 A::m_A 10 11
静态成员函数
1、所有对象共享同一函数
2、静态成员函数只能访问静态成员变量
4.3C++对象模型和this指针
成员变量和成员函数分开存储
在c++中类内的成员变量和成员函数分开存储,只有非静态变量成员才属于类的对象上。
空对象占用一个字节内存,是为了区分空对象占用内存的位置
每个空对象也应该占用唯一的内存地址
this指针概念
C++中类成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会公用一块
代码。这块代码通过this指针来指向被调用的成员函数所属的对象。
this指针是隐含每一个非静态成员函数内的一种指针,
this指针不需要定义,直接使用即可
this 指针的用途
1、当形参和成员便同名时,可用this 指针来区分
1 class Persion 2 { 3 Persion(int age) 4 { 5 this->age=age; //用this 指针区别成员变量和形参同名的 6 //this 指向被调用的成员函数所属的对象 7 } 8 int age; 9 }; 10 11
2、在类的非静态成员函数中返回对象本身,可使用return *this
1 class Persion 2 { 3 public: 4 Persion (int age) 5 { 6 this->age=age; 7 } 8 Persion & addage(Persion & p) 9 { 10 this->age+=p.age; 11 return *this;//返回对象本身 12 } 13 int age; 14 }; 15 16 17 int main() 18 { 19 Persion p1(10); 20 Persion p2(10); 21 p2.addage(p1).addage(p1).addage(p1).addage(p1).addage(p1);//链式编程思想 22 cout<<p2.age<<endl; 23 return 0; 24 }
4.3.3空指针访问成员函数
c++中空指针也可以调用成员函数的,但是也要注意有没有用到this指针,如果
用到this指针,需要加以判断保证代码的健壮性。
1 class Perison 2 { 3 public: 4 void ShowPersionName() 5 { 6 cout<<"ShowPersionName"<<endl; 7 } 8 void Showage() 9 { 10 if(this ==NULL)//防止this指向空指针时程序崩溃 11 { 12 return; 13 } 14 cout <<m_Age<<endl;//cout<<m_Age相当于cout<<this->m_Age 15 } 16 int m_A; 17 }; 18 19 int main() 20 { 21 22 Persion *p1 =NULL; 23 p1->ShowPersionName(); 24 p1->Showage(); 25 return 0; 26 } 27 28 29
4.3.4const修饰成员函数
常函数:成员函数后加const后叫常函数 //void showpersion () const{}
常函数内不可以修改成员属性
成员属性声明时加关键字mutable后,在常函数和常对象中依然可以修改
常对象:声明对象前加const称常对象
常对象只能调用常函数

浙公网安备 33010602011771号