C++学习笔记(day2)持续更新中

面向对象:objected-oriented programming
C语言是一系列函数描述程序的工作过程,称为面向过程。c++把程序里面的数据和对数据的操作合起来看作一个实体(称为对象),编程工作就是操纵这些对象相互作用来完成程序的功能,这样的编程方式称为面向对象编程

抽象:每个实体都有很多的数据和行为,只提取关心的数据和行为

封装:用抽象的结果来描述实体的类型,称为封装。在c++中,可以用结构来实现封装,但出于跟c语言兼容,一般在c++中结构也只封装数据,用class关键字来实现真正的封装,称为类。
封装好的类和结构都只是一个类型
定义类:
class xxx{
成员变量或者成员函数的定义
};
结构和类的区别:结构默认就是简单打包,内容对外是透明的,可以通过结构变量名访问它的任何一个成员。类默认是保密封装,对外不是透明的,不允许通过变量直接访问它的成员,除非是故意公开的(public)。一般公开的都是函数。
这种类或者结构类型的变量(实例)就称之为对象。
成员函数如果在外面实现(函数体不写在类内部),那么函数名应该写成“类名::函数名”。结构也是如此。

多文件结构:一个类一般写成一个.h文件和一个.cpp文件,在.h文件中,成员函数只有声明,没有函数体,在.cpp文件中包含.h文件并且给出那些成员函数的定义(包括函数体)。
创建每一个对象时会自动调用一个成员函数,称为构造函数。函数名就使用类名,无返回类型。构造函数可以重载,一般访问限制为公开。创建对象如果不传参数,不要带空括号,否则会被误认为是一个函数声明

如果一个类没有构造函数,编译器会自动为它产生一个空函数。只要有构造函数,编译器就不再为这个类产生无参构造函数(默认构造函数、缺省构造函数)

一个对象创建时如果需要做额外的事情,就可以放在构造函数里面。创建对象的实际操作步骤:分配内存,执行构造函数。如果成员是对象,成员的构造函数会在整体的构造函数之前执行。
this:调用成员函数时,编译器总是自动把它的对象的地址作为一个隐含参数传递;在成员函数内部,用关键字this来接受这个隐含参数,类型为*this表示当前对象的地址。

静态成员:属于整个类的数据或者行为
静态成员变量:所有这个类的对象公用一份,在类外面初始化,初始化时要在变量名前面用类名双冒号修饰。
静态成员函数:所有这个类的对象共同的行为,不依赖于任何一个对象,因此静态成员函数中不存在this,只能访问静态成员,访问静态成员必须要指明对象。

单例模式
3.初始化列表:
在构造函数定义里紧跟参数表之后可以有一个初始化列表,用冒号开头,后面有若干对“成员变量(初始值)”,多对之间用逗号分隔;

引用:给变量起别名
语法:数据类型 &别名 = 原名
int a = 10;
int &b = a;
引用必须初始化
引用在初始化后,不可以改变
如果函数的返回值是引用,返回值可以作为左值。
引用的本质是一个指针常量
常量引用
使用场景:用来修饰形参,防止误操作
引用必须引一块合法的内存空间
函数默认参数
如果我们自己传入数据,就会使用自己的数据,如果没有,那么就用默认值
语法:返回值类型 函数名(形参 = 默认值){}
注意事项:1.如果某个位置已经有了默认参数,那么从这个位置往后,从左往右都必须有默认值
错误案例:
int sum(int a=10,int b,int c){}
2.如果函数声明有默认参数,函数实现就不能有默认参数
声明和实现只有一个有默认参数
析构函数语法:~类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上符号
3.析构函数不可以有参数,因此不可以发送重载
4.程序在对象销毁前会自动调用析构,无需手动调用而且只会调用一次
构造函数语法:类名(){}
1.构造函数,没有返回值也不写void
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用对象时会自动调用构造函数,无须手动调用,而且只会调用一次
构造和析构都是必须有的实现,如果我们自己不提供,编译器会提供一个空实现的构造和析构
函数占位参数
c++中函数的形参列表里可以有占位参数,用来占位,调用函数时必须填补该位置。
语法:返回值类型 函数名(数据类型){}
函数重载
可以让函数名相同,提高复用性 1.要在同一个作用域下2.函数名称相同
3.函数参数类型不同,或者个数不同,或者顺序不同
注意:函数的返回值不可以作为函数重载的条件
当函数重载碰到默认参数,出现二义性,会报错
c++面向对象的三大特性:封装 继承 多态
类中的属性和行为我们统一称为成员
属性也叫 成员属性 成员变量
行为也叫 成员函数 成员方法
访问权限
公共权限public 保护权限 protected 私有权限 private
公共权限 类内可以访问 类外也可以访问
保护权限 类内可以访问 类外不可以访问 子可以访问父的内容
私有权限 类内可以访问 类外不可以访问 子不可以访问父的内容
struct 默认权限是公共的
class默认权限是私有的
成员属性设置为私有 可以自己控制读写权限 对于写可以检测数据的有效性
文件的拆分 .h文件里声明 .cpp文件里实现 然后主程序里调用即可
构造函数的分类和调用
1.按照参数分类 有参和无参(默认构造)
2.按照类型分类 普通和拷贝
拷贝写法
类名(const 类名& p){}
括号法 显示法 隐式转换法
调用默认构造函数的时候不要加()否则编译器会认为这是一个函数的声明
类名();匿名对象 特点:当前执行结束后,会立即释放
不要利用拷贝构造函数 初始化匿名对象 编译器会认为重定义
拷贝构造函数的调用时机
使用一个已经创建完毕的对象来初始化一个新对象
以值传递的方式给函数参数传值
以值方式返回局部对象
创建一个类,c++编译器会给每个类都添加至少3个函数
默认构造 析构函数 拷贝构造
如果我们写了有参构造函数,编译器就不再提供默认构造,依然提供拷贝构造
如果我们写了拷贝构造函数,编译器既不再提供其他普通构造函数
浅拷贝:简单的赋值拷贝操作(编译器)
深拷贝:在堆区重新申请空间,进行拷贝操作
析构函数在这个时候可以将堆区开辟数据做释放操作
浅拷贝带来的问题就是堆区的内存会重复释放
深拷贝可以避免这个问题。
初始化列表: 类名(int a,int b,int c):m_a(a),m_b(b),m_c©{}

当其他类对象作为本类成员,构造时候先构造对象,再构造自身,析构相反
c++类中的成员可以是另一个类的对象,我们称改成员为对象成员
静态成员函数 所有对象共享同一函数 静态成员函数只能访问静态成员变量 可以通过对象访问 可以通过类名访问 类外访问不到私有静态成员函数
成员函数和成员变量是分开存储的 空对象占用内存空间为1字节
c++编译器会给每个空对象也分配一个字节空间,是为了区分对象占内存位置
每个空对象也应该有一个独一无二的内存地址
非静态成员变量 属于类的对象上 静态成员变量,不属于类对象上
非静态成员函数静态成员函数都不属于类的对象上
this指针指向被调用的成员函数所属对象(谁调用指向谁)解决名称冲突
this指针是隐含每一个非静态成员函数内的一种指针(不需要定义)
空指针不能访问成员函数 this指针不可以修改指针的指向
在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改(常函数)
加上关键字mutable可以修改const限定下的常函数中的成员的值
在对象前加const,变为常对象,在常对象下加mutable也可以进行修改
常对象只能调用常函数(因为普通成员函数可以修改属性)
友元的目的就是让一个函数或者类访问另一个类中的私有成员 关键字为friend
全局函数做友元 类做友元 成员函数做友元

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值