欢迎光临散文网 会员登陆 & 注册

C++全套视频教程【qt版】

2023-01-19 15:22 作者:玄炫植  | 我要投稿
  1. ::作用域 可以在局部中用全局变量



2.命名空间 防止类库冲突 namespace



3.你知道在命名空间外面定义成员函数吗?(无名的namespace只能在本文件使用类似于static)

namespace A{

int a;

func();

}

void A::func(){

}



4.using 使用命名空间

那么下面调用优先从命名空间找

代价容易冲突

图例,虽然使用using,但是访问的是局部变量a

只能veryLongName::a来使用



5.const 全局只读变量

上图为老师翻车实例(在c语言中)

const int num = 10;(文件1)

extern const int num;(文件2)

本来是要证明虽然const过的变量不能直接赋值,但可以通过取地址来间接赋值

如图中:int *p = (int *)#

*p = 2000;

但是操作失败了,原因是老师定义的const变量是全局变量,使用const后会在文字常量区存放,只可读不可改,因此只有用const在局部变量中在栈区开辟可读可写

(在cpp中)

而const在cpp中修饰全局变量,为内部链接,就是只能在当前文件中生效,不能直接用于其他源文件,非要使用可以这样

extern const int num = 10;(文件1)

extern const int num;(文件2)


const int date = 10;(只有这样初始化才放入符号表)

const的data存在符号表中,类似define,只有在extern或取地址时才会给data分配地址,由于存在符号表里,输出data依旧是原始值,因此改了没弔用

其他情况如下图

#P22


6.cpp中的引用reference(能不用指针就不用)

格式:int num = 10;

int &a = num;(引用)

int *a = #(取地址,注意区别)

给数组起别名

int arr[5] = {};

int (&my_arr)[5] = arr;

typedef int TYPE_ARR[5];

TYPE_ARR &my_arr = arr

引用可以在函数内部改变外部的数值(作为函数的参数)

引用作为函数返回值

int& my_data(){

static int num = 10;

return num;

}

引用的本质原理:使用指针常量(只要了解)

int num = 10;

int &a = num;

//计算机内部:int *const a = #


常引用,保证只读不改,用const修饰一下

const int &num = 10;(10是const int类型,常量引用)


7.内联函数(是真正的man不是[doge]func)

像预定义宏一样展开,不占用开销,做法是:

inline int func(int a){return ;} 函数体和声明写一起(以空间换时间)

inline 是给编译器的建议


8.函数的默认参数

从左往右,有默认则其后全部设置默认

建议函数声明设置缺省参数

extern int func01(int x = 2,int y =3){

return $$$;

}


9.函数重载(多态性)

同一作用域 参数个数不同 参数类型不同 参数顺序不同

PS:函数和默认参数函数小心二义性


10.extern "C" cpp中引用c函数有一套完整流程

#if __cplusplus


11.封装的概念

把变量和函数合成一个整体,封装在一个类中

跟Javabeans很像啊

对于类的外部访问权限才有意义

public:公共

private:私有

protect:保护

数据私有方法公公有,可以借助公有访问私有

成员数据占类的大小,函数不占

成员函数类内声明,类外定义

void Date::setNum(){}

alt+回车快速添加定义

类定义在.h 成员函数写在.cpp 在main.cpp中测试


12.构造函数和析构函数

构造函数函数名和类名相同,无返回值,可以有参数

析构函数在类名前加"~",无返回值,不能重载


拷贝构造函数:(用户不拷贝构造,系统调用默认的拷贝构造)

Date ob2 = ob1;(赋值使用默认拷贝构造)

自定义拷贝构造函数后


应用场景:


浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。(系统默认)

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。(自定义)



13.初始化列表

对于有参构造:

public:

Date (int a,int b, int c):m_a(a),m_b(b),m_c(c) //初始化成员列表

{

}

对于大类中对象成员的构造可以使用初始化(比如class C中有class A 和class B的对象)

explicit禁止构造函数隐式转换



14.动态对象创建


new和delete申请空间

//基本类型

int *p = NULL;

p = new int(100);

cout<<*p<<endl;

delete p;

//int 数组

int *arr = NULL;

arr = new int[5];

delete [] arr; //释放数组格式

//字符串

char *arr = new char[32];

strcpy(arr,"helloworld"); 不能new char[32]{"helloworld"};

delete [] arr;

//给类对象申请空间

Person *p = new Person("lucy",100);

//由于p是指针

p->showPerson();


对象数组

初始化:人为调用构造函数如下

new一下

PS:delete释放*void指针没有析构



15.静态成员变量

静态成员属于类

static int date;

int Person::date = 100; //类内说明,类外定义

类名加作用域和对象名加点都可以访问


static修饰静态成员函数

静态成员函数只能访问静态成员变量

const static int date;只读不可改,用const修饰静态成员

静态成员变量可以统计对象个数

单例模式



15.this指针

等价于this -> m_num = num;

隐含指针,无需定义,静态成员函数内部没有this指针

this和java中一样有就近原则


用*this返回对象

PS:返回引用



16.const修饰成员函数

const修饰常对象

const Date ob1(200); //修饰+初始化

ob1.setDate(); //报错

常对象只能调用const修饰的函数(void setDate(int date)const{})不能改



17.友元(外部访问私有成员)


还可以friend class Gay让类中的成员函数都作为友元函数


例题:

数组类的强化

arry.cpp main.cpp arry.h



18.运算符重载

operator关键字加运算符实现运算符重载

友元函数到类里

返回值为引用就可以迭代操作

ostream& operator<<(ostream &out,Person &ob){

out<<ob.name<<", "<<ob.num;

return out;

}

同理,"+"也可以

Person ob3 = ob1+ob2;//我打印不出来,思考1h没理解

解决方法,删掉自定义析构

因为delete时,目标指针的指向中途发生了改变,导致错误。




指针运算符重载

设计一个智能指针能自动释放堆区空间

对于=号,类中有指针才要重载运算符

系统默认浅拷贝(这里的等号并没有人为重载过)


防止内存泄漏

ob1 = ob2 = ob3 怎么重载呢?(从又往左迭代)

在operator前返回值改为对象引用类型即可

return *this //(ob)

Fun()是匿名对象 可以Fun()(100,200);




19.继承和派生




如上是公共继承

如下是保护继承

私有继承同理:

P105 用vs查看类的布局

关于构造顺序

从子类和父类同名的成员变量,在子类中默认使用本作用域的,想用父类的加作用域

[虚继承] (vs分析)

class 子类:virtual public 基类{};




20.多态


那我非要在用基类指针调用子类的sleep()呢?

c++提供了虚函数




虚析构的作用

通过基类指针或引用释放子类空间,在析构函数前加virtual

纯虚函数

抽象类不能实例化对象

抽象类作为接口


纯虚析构


重定义和重写



21.函数模板




函数模板可以重载,普通函数类型是确定的 具体化


类模板

template<class T1,class T2>

class Date{};


类模板 派生 普通类

显式调用父类有参构造

关于类外定义

友元函数在模板中定义



22.c++的类型转换

(1)静态类型转换(static_cast)

上行转换

Aniaml *p = static_cast<Aniaml*>(new Dog);

(2)动态转换(dynamic_cast)

(3)常量转换(const_cast)

(4)重新解释转换(reinterpret_cast)


23.C++异常抛出和捕获

不捕获直接退出

unwinding栈解旋:当异常被抛出后,期间栈上构造的所有对象都会被自动析构

异常的生命周期

抛地址(记得释放)

匿名对象(常用)

标准异常


24.cin用法





STL(标准模板库)





容器&迭代器使用


vs中for_each

容器里套容器(我套你猴子)

string



异常

字符串拼接

查找和替换

提取子串和插入

vector(容器)

它的迭代器跟普通指针一样可以++~

capacity>=元素个数(size)


vector的未雨绸缪机制(另寻地址)


resize作用于大小,不作用于容量,除非resize比capacity大


数据存取操作


C++全套视频教程【qt版】的评论 (共 条)

分享到微博请遵守国家法律