C++篇:基础入门(九)

C++篇:基础入门(九)

1.内存四区
代码区,全局区(static,全局变量,程序结束时销毁),栈区(局部变量,函数结束时销毁),堆区(new分配,由程序员定义分配,并手动销毁)
2.引用
本质:指针常量
引用做函数参数(一般加const 防止修改变量的值);引用做函数返回值;常量引用
3.浅拷贝和深拷贝
浅拷贝:类里面的默认拷贝构造函数
深拷贝: 复写拷贝构造函数,为需要开辟堆空间的变量提供新的堆区变量(防止多个指针指向同一堆区,导致析构函数里重复释放内存)
4.初始化列表
5.静态成员变量的所有对象共用一份数据;在编译阶段分配内存;类内申明,类外初始化;
静态成员函数只能访问静态成员变量;静态成员函数只存在一份(非静态成员函数也是只存在一份,总结就是只有非静态成员变量属于类的对象);pubilc的静态成员函数可以通过类名调用
6.this指针
解决名称冲突用this指针(this->age=age);返回*this 指针,成员函数最后return *this,函数返回值类型为Person&为引用类型,则返回本身对象,,返回值若为Person,则会调用自身拷贝构造函数(return若为Person等值相关的对象,会自动调用本身拷贝构造函数)
7.空指针
类的空指针可以访问成员函数,但是注意成员函数里面是否包含this指针,若有,则报错(类的空指针没有创建对象)
8.const修饰成员函数
例如:

void showPerson() const{m_A=100; }//const修饰的函数无法
//修改成员变量,编译报错,但是成员函数如果用mutable修饰,
//则仍可以被修改

由于this指针是const指针,所以上述函数相当于const Person* const this常指针常量

常对象只能调用常成员函数(因为普通成员函数可以修改成员变量)
9.友元
全局函数做友元(在类前带friend关键字申明一下全局函数);
友元类(在类前带friend关键字申明一下类);
友元成员函数(在类前带friend关键字申明一下类的成员函数);
10.继承对象模型

cl /d1 reportSingleClassLayout类名 文件

11.多态(静态和动态)
静态多态:函数重载和运算符重载(编译阶段确定函数地址)
动态重载:派生类和虚函数实现运行时多态(运行阶段确定函数地址)
12.纯虚函数和抽象类
纯虚函数:virtual 返回值类型 函数名 (参数列表)=0
当类中含有纯虚函数,这个类为抽象类(抽象类无法实例化对象)
13.虚析构和纯虚析构
多态时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构函数
解决:将父类的析构函数改为虚析构和纯虚析构
14.模板(泛型编程和STL)
机制:函数模板和类模板
函数模板:建立一个通用函数,返回值和形参可以不具体定制,使用一个虚拟的类型代表

template<typename T>
函数定义或申明

template ---申明创建模板
typename --- 后面符号为一种数据类型,可以用class代替
T ---通用的数据类型,名称可以替换,通常为大写字母
//调用
myswap(a,b);//隐式
或者
myswap < int >(a,b);//显式

不管隐式或者显式,都必须可推导出T的类型(T必须隐式或者显式推导出赋初值)
普通函数与函数模板区别:

1.普通函数可以发生隐式类型装换
2.函数模板分情况,自动类型推导不发生隐式类型转换
3.函数模板用显式指定类型,可以发生隐式类型转换

类模板:
类模板作用:建立一个通用类,类中的成员数据类型可以不具体定制,用一个虚拟的类型来代替

template<typename T>
类

类模板中的成员函数在调用时才创建(调用时才能确定T类型)

类模板对象做函数参数

1.指定传入类型
2.参数模板化
3.整个类模板化

当模板遇到继承时需要注意的地方:

1.子类在申明的时候要指定父类中T的类型
2.如果不指定,编译器无法给子类分配内存
3.若想灵活的指定父类的T类型,子类也需要成为模板

ex:
tenplate<class T>
class Base{
  T a;
};
class Son:public Base<int>{
};

子类也为类模板:
template<class T1,class T2> //T1为父类的参数,T2为子类的参数
class Son2:public Base<T1>{
  T2 b;
}

15.STL(标准模板库)
为了建立数据结构和算法的一套标准,诞生了STL(容器,算法,迭代器)
容器和算法通过迭代器无缝连接(算法通过迭代器访问容器),几乎所有代码都用了函数模板和类模板;STL六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器
vector容器:

容器:vector
算法:for_each
迭代器:vector<int>::iterator
利用迭代器循环打印容器内的值

#include<vector>
...
vector<int>v;
v.push_back(10);
v.push_back(20);
v.push_back(10);
v.push_back(30);

for (vector<int>::iterator it=v.begin();it != v.end();it++) {
    cout<<*it<<endl;
}
利用算法和迭代器循环打印容器内的值

#include<vector>
#include<algorithm>
...
void myPrint(int val){
  cout<<val<<endl;
}
...
vector<int>v;
v.push_back(10);
v.push_back(20);
v.push_back(10);
v.push_back(30);

for_each(v.begin(), v.end(), myPrint);

string容器(string本质为一个类,因此含有很多成员方法);
deque容器(双端操作,效率高);

仿函数:(本质是类)

class MyAdd{
public:
    int operator()(int v1,int v2){
        return (v1+v2);
    }

};
MyAdd myAdd;
cout << MyAdd(10,20)<<endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值