#include<iostream>
using namespace std;//循环队列 mencpy/realloc做的是内存的拷贝,不适合用于对象本身拷贝,对象占用外部资源classQueue{public:Queue(int size =5){
_pQue =newint[size];
_front = _rear =0;
_size = size;}~Queue(){delete[] _pQue;
_pQue = nullptr;}//为了避免浅拷贝,直接删除掉可能出现浅拷贝情况的复制重载和拷贝构造函数//Queue(const Queue&) = delete;//Queue& operator=(const Queue&) = delete;Queue(const Queue& src){
_size = src._size;
_front = src._front;
_rear = src._rear;
_pQue =newint[_size];for(int i = _front; i != _rear; i =(i +1)% _size){
_pQue[i]= src._pQue[i];}}
Queue& operator=(const Queue& src){//防止自赋值if(this==&src)return*this;delete[] _pQue;
_size = src._size;
_front = src._front;
_rear = src._rear;
_pQue =newint[_size];for(int i = _front; i != _rear; i =(i +1)% _size){
_pQue[i]= src._pQue[i];}return*this;}//入队操作,对尾入队voidpush(int val){if(full()){resize();}
_pQue[_rear]= val;
_rear =(_rear +1)% _size;}//出队操作voidpop(){if(empty()){return;}
_front =(_front +1)% _size;}//获取队头元素
int top(){return _pQue[_front];}
bool full(){return(_rear +1)% _size == _front;}
bool empty(){return _front == _rear;}private://为了扩容 队列定义为指针
int* _pQue;//申请队列的数组空间
int _front;//指示队头的位置
int _rear;//指示队尾的位置
int _size;//队列扩容的总大小voidresize(){
int* ptmp =newint[2* _size];
int index =0;for(int i = _front; i != _rear; i =(i +1)% _size){//从front遍历到rear 赋值给扩容后的队列
ptmp[index++]= _pQue[i];}delete[] _pQue;
_pQue = ptmp;
_front =0;
_rear = index;
_size *=2;}};
int main(){
Queue queue;for(int i =0; i <20;++i){
queue.push(rand()%100);}while(!queue.empty()){
cout << queue.top()<< endl;
queue.pop();}return0;}
构造函数初始化列表
#include<iostream>
using namespace std;classTest{public:Test(int data =10):mb(data),ma(mb){//构造函数列表初始化 顺序先初始化ma再初始化mb//成员变量的初始化和它们定义的顺序有关,和构造函数初始化列表中出现的先后顺序无关/*
ma = mb(此刻mb并未初始化是一个不确定的值)
mb = data (mb被初始化为10)
*/}private:
int ma;
int mb;//0XCCCC CCCC -858993460};//日期类classCDate{public:CDate(int y, int m, int d){
_year = y;
_month = m;
_day = d;}voidshow(){
cout << _year <<"/"<< _month <<"/"<< _day << endl;}private:
int _year;
int _month;
int _day;};/*
CDate信息是 CGoods商品信息的一部分 a part of
是用于组合的关系
*/classCGoods{public://构造函数的初始化列表:可以指定当前对象成员变量的初始化方式CGoods(const char* n, int a, double p,int y,int m,int d)//构造函数的初始化列表:是按照定义的顺序初始化 第一个先初始化,如果用第二个初始化第一个数,就会发生无效值的问题:_data(y,m,d)//制定了日期类型的构造方式,_amount(a)//int _amount = a; ,_price(p){//当前类类型构造函数体//不使用外部资源,不考虑浅拷贝带来的影响strcpy(_name, n);
_amount = a;//int _amount;_amount = a; 对于内置类型反汇编代码完全一致
_price = p;}voidshow(){
cout <<"name:"<< _name << endl;
cout <<"amount:"<< _amount << endl;
cout <<"price"<< _price << endl;
_data.show();}private://属性,日期也是属性的一部分
char _name[20];
int _amount;
double _price;
CDate _data;//成员对象 对象生成分为两步 1.分配内存 2.调用构造函数(没有指定默认调用默认构造函数,自定义构造函数后,编译器就不会产生默认构造函数)};
int main(){
CGoods good("商品",100,35.0,2019,5,12);
good.show();return0;}
类的各种成员方法和区别
#include<iostream>
using namespace std;/*
类的各种成员 - 成员方法/变量
普通成员方法, 必须使用对象调用,对象的地址当作实参传给函数,
成员方法多加一个this形参变量,用来接收调用他的this对象(通过this指针区分共享一套成员方法的this对象)
//编译器会添加一个this形参变量
1.属于类的作用域
2.调用该方法时,需要依赖一个对象,没有对象无法调用普通成员方法(常对象无法调用 实参const CGoods* 形参CGoods*)
3.可以任意访问对象的私有成员变量 (protect只有在继承的时候才会起作用)
静态成员方法
//不会生成this形参
1.使用类名作用域来调用,而不是使用类对象来调用
2.没有this指针,不依赖于对象,访问所有对象共享的信息
3.属于类的作用域
4.可以任意访问对象的私有成员,仅限于不依赖对象的成员(只能调用其他的static静态成员)
常成员方法
//const CGood*this
1.属于类作用域
2.调用依赖一个对象,普通对象和常对象皆可
3.可以任意访问对象的私有成员,只能读,不能写,this指针被const修饰,所以不能改变
*/classTest{public:Test(int data =10):mb(data),ma(mb){//构造函数列表初始化 顺序先初始化ma再初始化mb//成员变量的初始化和它们定义的顺序有关,和构造函数初始化列表中出现的先后顺序无关/*
ma = mb(此刻mb并未初始化是一个不确定的值)
mb = data (mb被初始化为10)
*/}private:
int ma;
int mb;//0XCCCC CCCC -858993460};//日期类classCDate{public:CDate(int y, int m, int d){
_year = y;
_month = m;
_day = d;}voidshow(){
cout << _year <<"/"<< _month <<"/"<< _day << endl;}private:
int _year;
int _month;
int _day;};/*
CDate信息是 CGoods商品信息的一部分 a part of
是用于组合的关系
*/classCGoods{public://构造函数的初始化列表:可以指定当前对象成员变量的初始化方式CGoods(const char* n, int a, double p, int y, int m, int d)//构造函数的初始化列表:是按照定义的顺序初始化 第一个先初始化,如果用第二个初始化第一个数,就会发生无效值的问题:_data(y, m, d)//制定了日期类型的构造方式,_amount(a)//int _amount = a; ,_price(p){//当前类类型构造函数体//不使用外部资源,不考虑浅拷贝带来的影响strcpy(_name, n);
_amount = a;//int _amount;_amount = a; 对于内置类型反汇编代码完全一致
_price = p;//一个新对象的产生一定会调用构造函数,使用静态成员变量在构造函数中累加所有出现的对象
_count++;//记录所有产生的新对象的数量}voidshow(){
cout <<"name:"<< _name << endl;
cout <<"amount:"<< _amount << endl;
cout <<"price"<< _price << endl;
_data.show();}//常成员方法 和普通成员方法构成重载关系//只要是只读操作的成员方法,一律实现成const常成员方法voidshow()const//const CGoods *this{//常成员方法只能调用 常方法 不能调用普通方法//普通方法和常方法的形参不同
cout <<"name:"<< _name << endl;
cout <<"amount:"<< _amount << endl;
cout <<"price"<< _price << endl;}//普通成员方法//打印所有商品共享的信息voidshowCGoodsCount(){
cout <<"所有商品的种类数量是:"<< _count << endl;}//静态成员方法staticvoidshowCGoodsCountA(){
cout <<"所有商品的种类数量是:"<< _count << endl;}private://属性,日期也是属性的一部分
char _name[20];
int _amount;
double _price;
CDate _data;//成员对象 对象生成分为两步 1.分配内存 2.调用构造函数(没有指定默认调用默认构造函数,自定义构造函数后,编译器就不会产生默认构造函数)static int _count;//静态成员变量声明,时所有成员对象共享的 需要在类外进行定义,记录这个类所有对象商品的总数量//不属于对象,属于栈级别};//static 成员变量一定要在类外进行定义并且初始化 计算对象成员大小时,静态成员是不计入对象内存大小的 对象在stack段 静态成员变量在bss段
int CGoods::_count =0;
int main(){
CGoods good("商品",100,35.0,2019,5,12);
good.show();
CGoods good2("商品2",100,35.0,2019,5,12);
good2.show();
CGoods good3("商品3",100,35.0,2019,5,12);
good3.show();
CGoods good4("商品4",100,35.0,2019,5,12);
good4.show();//从语义上讲不符合,用good2打印了所有商品的信息
good2.showCGoodsCount();//使用类名调用所有对象共享的信息,合乎语义规则
CGoods::showCGoodsCountA();//统计所有商品的总数量const CGoods good5("非卖品",10,10.0,10,10,10);//常对象调用普通方法出错// good5.show() == CGoods::show(&good5) 需求的形参CGoods*this 实际提供的实参const CGoods*return0;}
指向成员变量的指针
#include<iostream>
using namespace std;/*
指向类成员(成员变量和成员方法)的指针
定义指针指向类的普通成员变量,需要加一个类的作用域
定义指针指向类的静态成员变量,可以使用普通指针指向
*/classTest{public:voidfunc(){ cout <<"call Test::func()"<< endl;}staticvoidstatic_func(){ cout <<"Test::static_func"<< endl;}
int ma;static int mb;private:};
int Test::mb =10;
int main(){
Test t1;
Test *t2 =newTest();//int *p = &Test::ma 无法从" int Test::* " // 转换为" int * "//加了类的作用域的指针 //指向的是类作用域里面的变量,不是全局的变量
int Test::* p =&Test::ma;//给对象解引用才能使用指针访问,依赖对象
t1.*p =20;(t2)->*p =30;(*t2).*p =15;
cout << t1.*p <<" "<< endl;// .*和->等价 t2是指针,存放地址 t1是对象//静态成员变量不依附于对象,不需要对象和作用域
int* p1 =&Test::mb;*p1 =40;
cout <<*p1 << endl;delete t2;return0;}
指向成员方法的指针
#include<iostream>
using namespace std;/*
指向成员方法的指针,定义函数指针指向函数
*/classTest{public:voidfunc(){ cout <<"call Test::func()"<< endl;}staticvoidstatic_func(){ cout <<"Test::static_func"<< endl;}
int ma;static int mb;private:};
int Test::mb =10;
int main(){
Test t1;
Test* t2 =newTest();//返回值是void,不带形参的一个函数void(Test::*pfunc)()=&Test::func;(t1.*pfunc)();(t2->*pfunc)();void(*func1)()=&Test::static_func;return0;}