c++语言学习
2020-08-20 17:15:25 0 举报
AI智能生成
c++ 基础语法(持续更新)
作者其他创作
大纲/内容
分支主题
子主题
基础语法
iostream
cout
cin
using namespace std
循环
while for
逻辑
if
else if
else
进阶语法
函数重载
同名不同参数
引用作为重载的条件
函数重载碰到默认参数
导致二义性,报错
子主题
引用
int &a = b;
const引用可以直接=一个数
const int &a =10
类和对象
性质
封装
属性和行为在一起时,表现事物
访问权限
public
内外都可访问
private
内可,外否
提供public接口,行为方法来访问私有的值
子类不可访问
好处:可以自己控制读写权限和检测数据的有效性
protected
内可,类外不可访问
子类可访问
创建一个类
模板
class Play{public: int a; private : void submit ; };(类名默认首字母大写)
空类占1字节
创建对象
Play p1;(实例化)
给对象赋值
p1.a=10;
成员:类中的属性和行为
属性
成员变量
成员属性
行为
成员方法
成员函数
构造函数和析构函数
构造函数
与类名相同
无返回值,连void也没有
若没有定义则调用默认的
实例化就自动调用,并且只调用一次
可以有参数,可以重载
析构函数
无返回值
与类名相同,不同的是名称前加~
不可有参数
无需手动调用,程序在自毁前自动调用
struct 和class 区别
struct 默认为public
class 默认为private
拷贝(面试)
深拷贝
自定义拷贝函数
浅拷贝
Play p1(p2)
简单的赋值操作
编译器提供的拷贝构造函数会做浅拷贝操作
浅拷贝带来的问题是堆区内存的重复释放
解决方法用深拷贝
使数据指向不同的堆区
也可以说使自己写一个拷贝函数
Play(const Play &p){...m_x=new int(*p.m_x)}相当于重新找一个堆区存放数据
初始化列表
用于初始化属性
初始化构造函数
对象成员
类中的成员是另一个类中的对象
静态成员函数
所有对象共享一个函数
静态成员函数只能访问静态成员变量
访问方式
通过对象
p1.func();
通过类名
Person::func();
对象模型和this指针
对象模型
成员变量
子主题
成员函数
用const修饰
不可修改成员属性
但可以加mutable就可以修改了
void show() const 修饰的this指针,此时指针指向的值就不可以修改
mutable int a;就可以修改了
都不占对象空间
空对象占内存空间为1,编译器给每个空对象分配一个字节空间
空对象也应该有一个独一无二的内存地址
非静态成员变量属于类的对象上
其他都不属于类的对象
空指针
调用成员函数
Person * p =Null
空的值访问不到成员会报错
this 指针
指向被调用的成员函数所属的对象
用->指向
谁调用就指向谁
隐含在每一个非静态成员函数内的一种指针
不需要定义
友元
friend
全局函数做友元
可访问私有成员
成员函数做友元
friend void good::visit();
类做友元
friend class good
运算符重载
内置数据类型
编译器知道如何运算
左移运算符重载
<<
重载符号
成员
void operator << (cout)
通常不会用成员函数重载
因为<<左边必须有对象
全局函数
(本质)void operator<<(cout ,p)
ostream& operator<<(ostream &cout ,Person &p){return cout}
返回引用是为了对一个数据一直做操作
上面返回cout 就可以链式编程
把全局函数友元就可以输出私有的成员
加法运算符重载
+
operator+()
定义方法
成员函数重载+号
Person operator+(Person &p)
使用方法
(本质)Person p3 =p1.operator(p2)=Person p3 =p1 + p2;
全员函数
Person operator+(Person &p1,Person &p2)
使用方法
(本质)Person p3 = operator+(p1,p2)
Person operator+(Person &p1, int num);
递增运算符重载
++
return *this(返回自身)
ostream& operator<< (ostram& cout ,Myinteger myint)
后置递增
不用引用
返回值
前置递增
要用引用
返回引用
void operator++(int)
赋值运算符重载
=
堆区数据需要释放
会出现重复释放堆区造成程序崩溃的现象
需要自己定义深拷贝函数
return *this 来连等于
关系运算符
<和> 和==
void operator==(Person &p)(中间用this只想每一个成员变量来判断 )
函数调用运算符重载
例子:void operator()(String test){cout << test<<endl;}
继承
基础语法
class per :public basepage
目的:减少重复的代码
继承方式
公共继承
除了private都可以访问
且不改变权限
保护权限类外仍然访问不到
保护继承
继承后都为保护权限
类外都不可访问
私有继承
全部变为私有权限
类外都不可访问
三种都访问不了私有权限
三种以什么方式继承就在继承中为什么权限
对象模型
父类中所有非静态的成员属性都会被子类继承下去
字节数在但是private是不能访问的
构造函数和析构函数
调用顺序
先父类的构造
再子类构造和析构
最后子类析构
同名成员的处理方式
子类对象访问父类中的同名成员要加作用域::
因为父类中的同名成员编译器会自动隐藏
函数也要加作用域 ::
同名静态成员处理方式
访问子类直接访问
访问父类要加作用域
多继承语法
class 子类 : 继承方式1 父类1,继承方式2 父类2
菱形继承
钻石继承
实例
主父类用虚拟继承父类
虚继承来解决
防止数据浪费
多态
C++面向对象三大特性之一
静态多态
编译段确定函数地址
动态多态
运行阶段确定函数地址
满足条件:有继承关系和子类重写父类的虚函数
使用条件:父类指针或引用指向子类对象
原理剖析
虚函数指针 虚函数
好处
扩展新的功能需求源码
组织结构清晰
对于前期和后期拓展的维护性高
进行开闭原则
对扩展经行开放,对修改经行关闭
纯虚函数和抽象类
抽象类的特点:无法实例化对象
抽象类的子类必需重写抽象类中的纯虚函数否则也属于抽象类
纯虚函数定义
virtual 返回值类型 函数名 (参数列表) = 0;
然后在子类中重写虚函数
实参传入实例化的对象
形式参数用父类实例化一个指针代表传入的实例化的对象
注意创建堆区后要释放
使用析构函数释放
A->B则A为指针,->是成员提取,A->B是提取A中的成员B,A只能是指向类、结构、联合的指针;
而A.B,A是对象调用类中的成员B
文件操作
<fstream>
文件类型
文本文件
二进制文件
操作方式,三大类
ofstream(写)
ifstream(读)
fstream(读写)
写文件
创建流对象
打开文件
写数据
关闭文件
ofs.close();
ofs<< “想写的数据”
ofs.open("文件路径"或者文件名,打开方式)
不指定路径的话,就在项目的路径下创建项目
ofstream ofs
写文件
创建流对象
打开文件
读取数据(4种方式)
fs.close();
打开方式
ifs.is_open()判断是否打开
ifs.open(“文件路径”,打开方式)
ifstream ifs
二进制方式
读文件
写文件
和ofstream方式写一样
不同处
ofs.open("the way to the project",ios::out |ios ::binary);
写文件方式
Person p =(“sp”,52)
ofs.write((const char *)&p ,sizeof (Person));
动物
羊
骆驼
草泥马
打开方式
ios::out
为写文件而打开文件
ios::in
为读文件而打开文件
ios::ate
初始位置文件末尾
ios::app
追加方式写文件
ios::trunc
文件存在先删除在创建
ios::binary
二进制方式
读取方式
char buf[1024] = {0};
1.while (ifs>> buf){cout<< buf << endl ;}
2.while(ifs.getline(buf,sizeof(buf))){cout <<buf << endl};
3.string buf
while(getline(ifs,buf)){cout<< buf << endl;}
4.(不推荐)
char c;
while ((c= ifs.get())!= EOF){cout << c; }
十分重要
读写文件记住一定要有关闭文件
virtual int getResult()
class Addcalculator : public Abstractcalculator
int getsult()
实例化对象
Abstractcalculator *abc = new Addcalculator
abc->m_Num =10
初始化成员
给虚函数实例化
0 条评论
下一页