营销型网站建设运营,企业宣传网页设计,网站搜索引擎优化的内容,静态页面加wordpressC中类的前身
1 面向对象三大特征#xff1a;封装、继承、多态
2 封装#xff1a;将能够实现某一事物的所有万事万物都封装到一起#xff0c;包括成员属性#xff08;成员变量#xff09;#xff0c;行为#xff08;功能函数#xff09;都封装在一起#xff…C中类的前身
1 面向对象三大特征封装、继承、多态
2 封装将能够实现某一事物的所有万事万物都封装到一起包括成员属性成员变量行为功能函数都封装在一起我们称之为类。并向外部提供公共的接口用户可以通过该接口来控制该类实例化的对象。
3 只需将C中的结构体的struct改成class就是类的定义
4 类的定义格式
class 类名 { 访问权限 成员 };
类的说明
1 类中的访问权限有三种public、protected、private
public:该权限下的成员可以在类内、子类中以及类外被访问
protected该权限下的成员可以在类内、子类中被访问类外不能被访问
private该权限下的成员只能被类内访问类外、子类中都不能被访问
在类中默认的访问权限是private
2 类中可以有成员属性和成员函数一般成员属性设置成私有、成员变量设置成公共的
3 类中的成员函数可以访问类中所有权限下的成员包括私有成员
4 每种访问权限可以在类中出现多次每个访问权限从关键字开始到下一个关键字为止或者整个类体结束。
5 一般将同一权限下的所有成员放在一起
6 如果非要在类外对私有成员或受保护的成员进行读取或者写入需要在类内提供相关公共的接口来完成
7 类的访问权限是针对于类体而言而不是针对于类对象而言
#include iostreamusing namespace std;//定义一个 Person 类
class Person
{
public:string name 张三;char sex; //性别private:int age 18;protected:int money;public://定义展示函数void show(){coutname nameendl; //公共权限下的成员类内可以被访问coutsex sexendl; //公共权限下的成员类内可以被访问coutage ageendl; //私有权限下的成员类内可以被访问coutmoney moneyendl; //受保护权限下的成员类内可以被访问}//定义设置年龄函数void set_age(int a){if(a0){cout设置失败endl;return;}age a;}//定义获取年龄的函数int get_age(){return age;}};int main()
{//class Person p1; //使用类定义一个变量Person p1; //使用类定义一个变量 --- 使用Person类实例化一个对象p1.name 二狗; //类中公共权限下的成员类外可以被访问p1.sex M; //类中公共权限下的成员类外可以被访问//p1.age 18; //类中私有权限下的成员类外无法被访问//p1.money 1000000; //类中受保护的成员类外无法被访问p1.show(); //类中公共权限下的成员类外可以被访问//设置年龄p1.set_age(118);coutp1.age p1.get_age()endl;return 0;
}
练习定义一个矩形Rectangle类拥有私有成员属性宽度(width)、高度(hight)
公共成员函数
初始化函数void init(int w, int h)
获取宽度函数get_w();
设置宽度函数set_w(int w);
获取高度函数get_h();
设置高度函数set_h(int h);
获取周长函数get_perimeter();
获取面积函数get_area();
在主程序中实例化对象并测试下相关函数
#include iostreamusing namespace std;class Rectangle //定义一个矩形类
{//私有成员属性
private:int width; //矩形的宽度int hight; //矩形的高度
public://初始化函数void init(int w,int h){if(w0 || h0){cout初始化失败endl;return;}widthw;highth;}//设置宽度函数void set_w(int w){widthw;}//设置高度函数void set_h(int h){highth;}//获取宽度int get_w(){return width;}//获取周长int get_peri(){return 2*width2*hight;}//获取面积int get_area(){return width*hight;}
};int main()
{Rectangle r1; //实例化一个矩形对象r1.init(3,5); //初始化矩形cout矩形的周长为r1.get_peri()endl;cout矩形的面积为r1.get_area()endl;//重新设置矩形的宽度r1.set_w(10);cout矩形的周长为r1.get_peri()endl;cout矩形的面积为r1.get_area()endl;return 0;
}
练习在上面的案例上面加一个功能比较两个矩形框是否相等 bool judge()
判断两个矩形相等的原则widthwidth heighheigh
全局函数版本 bool judge(Rectangle r1, Rectangle r2);
#include iostreamusing namespace std;class Rectangle //定义一个矩形类
{//私有成员属性
private:int width; //矩形的宽度int hight; //矩形的高度
public://初始化函数void init(int w,int h){if(w0 || h0){cout初始化失败endl;return;}widthw;highth;}//设置宽度函数void set_w(int w){widthw;}//设置高度函数void set_h(int h){highth;}//获取宽度int get_w(){return width;}//获取周长int get_peri(){return 2*width2*hight;}//获取面积int get_area(){return width*hight;}//获取矩形框高度int get_h(){return hight;}//定义成员函数比较两个矩形是否相等bool judge(Rectangle r1, Rectangle r2){//比较逻辑if(r1.widthr2.width r1.hightr2.hight){return true;}return false;}//定义成员函数比较当前矩形框和其他传入的矩形框是否相等bool judge(Rectangle other){//比较逻辑if(widthother.width hightother.hight){return true;}return false;}
};//定义全局函数完成求两个矩形框是否相等
bool judge(Rectangle r1, Rectangle r2)
{//比较逻辑if(r1.get_w()r2.get_w() r1.get_h()r2.get_h()){return true;}return false;
}int main()
{Rectangle r1; //实例化一个矩形对象r1.init(3,5); //初始化矩形cout矩形的周长为r1.get_peri()endl;cout矩形的面积为r1.get_area()endl;//重新设置矩形的宽度r1.set_w(10);cout矩形的周长为r1.get_peri()endl;cout矩形的面积为r1.get_area()endl;//实例化另一个矩形框Rectangle r2;r2.init(10,10);//判断两个矩形框是否相等/*if(judge(r1,r2)) //调用全局函数{cout两个矩形框相等endl;}else{cout两个矩形框不相等endl;}*//*调用成员函数判断两个矩形框是否相等if(r1.judge(r1, r2)){cout两个矩形框相等endl;}else{cout两个矩形框不相等endl;}*/if(r1.judge(r2)){cout两个矩形框相等endl;}else{cout两个矩形框不相等endl;}return 0;
}分文件编译
头文件
#ifndef RECANTLE_H
#define RECANTLE_H#include iostream
using namespace std;class Rectangle //定义一个矩形类
{//私有成员属性
private:int width; //矩形的宽度int hight; //矩形的高度
public://初始化函数void init(int w,int h);//设置宽度函数void set_w(int w);//设置高度函数void set_h(int h);//获取宽度int get_w();//获取周长int get_peri();//获取面积int get_area();//获取矩形框高度int get_h();//定义成员函数比较两个矩形是否相等bool judge(Rectangle r1, Rectangle r2);//定义成员函数比较当前矩形框和其他传入的矩形框是否相等bool judge(Rectangle other);
};//全局函数的声明
bool judge(Rectangle r1, Rectangle r2);#endif // RECANTLE_H源文件
#include recantle.h//初始化函数
void Rectangle::init(int w,int h)
{if(w0 || h0){cout初始化失败endl;return;}widthw;highth;
}//设置宽度函数
void Rectangle::set_w(int w)
{widthw;
}
//设置高度函数
void Rectangle::set_h(int h)
{highth;
}
//获取宽度
int Rectangle::get_w()
{return width;
}
//获取周长
int Rectangle::get_peri()
{return 2*width2*hight;
}
//获取面积
int Rectangle::get_area()
{return width*hight;
}//获取矩形框高度
int Rectangle::get_h()
{return hight;
}//定义成员函数比较两个矩形是否相等
bool Rectangle::judge(Rectangle r1, Rectangle r2)
{//比较逻辑if(r1.widthr2.width r1.hightr2.hight){return true;}return false;
}//定义成员函数比较当前矩形框和其他传入的矩形框是否相等
bool Rectangle::judge(Rectangle other)
{//比较逻辑if(widthother.width hightother.hight){return true;}return false;
}//定义全局函数完成求两个矩形框是否相等
bool judge(Rectangle r1, Rectangle r2)
{//比较逻辑if(r1.get_w()r2.get_w() r1.get_h()r2.get_h()){return true;}return false;
}
测试文件
#includerecantle.h //引入自定义的头文件int main()
{Rectangle r1; //实例化一个矩形对象r1.init(3,5); //初始化矩形cout矩形的周长为r1.get_peri()endl;cout矩形的面积为r1.get_area()endl;//重新设置矩形的宽度r1.set_w(10);cout矩形的周长为r1.get_peri()endl;cout矩形的面积为r1.get_area()endl;//实例化另一个矩形框Rectangle r2;r2.init(10,10);//判断两个矩形框是否相等/*if(judge(r1,r2)) //调用全局函数{cout两个矩形框相等endl;}else{cout两个矩形框不相等endl;}*//*调用成员函数判断两个矩形框是否相等if(r1.judge(r1, r2)){cout两个矩形框相等endl;}else{cout两个矩形框不相等endl;}*/if(r1.judge(r2)){cout两个矩形框相等endl;}else{cout两个矩形框不相等endl;}return 0;
}
this指针
1 this指针是类中系统为所有非静态成员函数提供的一个隐藏的形参指针指代当前对象的起始地址
2 指代当前对象哪个对象使用我我就指向哪个对象
3 在非静态成员函数中如果调用了类中的成员成员函数、成员变量即使没有加this系统也默认加了this。
局部名称屏蔽成员名称除外
4 this的原型 类名 * const this;
5 必须使用this的情况
1、当形参名和成员名同名时可以使用this用于区分
2、在拷贝赋值函数中用于返回自身引用时必须使用this后期讲
#include iostreamusing namespace std;class Stu
{string name zhangsan;int age 18;public://非静态成员函数void show(){coutshow::this thisendl;//coutname name age ageendl;coutname this-name age this-ageendl;}//定义设置函数void set_data(string name, int a) //this形参的原型 Stu * const this;{coutset_data::this thisendl;this-name name; //将形参name赋值给成员变量namethis-age a; //可以通过this改变指针指向的内存空间中的值//this NULL; //不能通过this改变指针的值this-show(); //成员函数中调用另一个成员函数}};
类的大小
1 一个空类的大小为 1 字节用于占位作用后期如果有成员变量就会将该1字节空间分配给成员使用
2 类中的成员函数不占类体的大小成员函数只有被调用时才会分配空间
3 只有类的成员属性才占内存空间其类的大小要遵循字节对齐原则
4 如果类中有虚函数则会多一个虚指针的空间 后期讲
#include iostreamusing namespace std;//一个空类的大小为 1字节
class A
{};//成员 变量占内存空间要符合字节对齐原则
class B
{int value_a;char value_b;short value_c;char value_d;double value_e;short value_f; //11112033400000005555555566000000
};//定义一个类既有成员属性也有成员变量,类的成员函数是不占类体的空间的
class C
{int a;void show(){int b;coutb b a aendl;}void display(){this-show();}
};//当类中出现虚函数时系统会给类默认提供一个虚指针无论有多少虚函数都只提供一个虚函数指针
class D
{int value_a; //成员变量//非虚函数void show(){}//定义虚函数virtual void diaplay(){}//虚函数 virtual void fun(){}
};int main()
{cout sizeof(A) endl; // 1cout sizeof(B) endl; // 32cout sizeof(C) endl; // 4cout sizeof(D) endl; // 16return 0;
}
类中特殊成员函数
1 当定义一个空类时即使没有手动定义某些函数C系统会默认自动为其提供一些特殊成员函数
2 这些函数也可以程序员手动定义当手动定义后系统就不再提供默认的了
3 这些函数也无需程序员手动调用在特殊时期C系统会自动调用
4 种类构造函数、析构函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值函数、取地址运算符重载函数
构造函数
1 构造函数是在使用类实例化对象时用于给类对象分配内存空间以及对成员进行初始化工作时使用
2 定义格式
1、构造函数没有返回值不需要写返回值类型 2、函数名与类同名 3、可以有参也可以无参 4、一般为公共权限 5、格式 类名(形参列表){函数体内容}
3 调用时机无需程序员手动调用当使用一个类实例化对象时系统自动调用构造函数
4 调用格式
无参构造 类名 对象名
例如string s1;
有参构造 类名 对象名实参列表;
例如string s2(hello a);
string s3(5, A);
5 一个类中可以定义多个构造函数要求参数必须不同这些构造函数构成重载关系
虽然一个类中可以定义多个构造函数但是一个类对象的只能使用一个构造函数构造出来
6 一个类中如果没有显性定义任何构造函数那么系统会默认提供一个无参构造函数
但凡类中提供任意一个构造函数系统就不再提供默认的无参构造函数了如果非要使用无参构造函数需要程序员手动定义无参构造函数
7 构造函数的形参列表也可以设置默认参数但是要注意是否跟其他重载的函数冲突
8 构造函数的初始化工作是在初始化列表中完成的。
初始化列表在构造函数函数头部后面由冒号引出完成初始化工作
格式 类名(形参类型1 形参1 形参类型2 形参2。。。 形参类型n 形参n) : 成员变量1形参1成员变量2形参2。。。成员变量n(形参n) {}
#include iostreamusing namespace std;//定义一个类
class Stu
{
private:const string name; //如果类中有const修饰的成员变量必须使用初始化列表完成对其进行初始化工作int age;public://无参构造函数Stu():name(二狗){//this-name 二狗;this-age 100;coutStu::无参构造endl;}//定义有参构造函数Stu(string n) :name(n){//this-name n;coutStu::有参构造1endl;}//定义有参构造//Stu(string n大毛, int a20) //带默认参数的构造函数Stu(string name, int age) :name(name), age(age) //使用初始化列表完成对成员的初始化工作{//此处是给成员变量赋值而不是初始化//this-name n;//this-age a;coutStu::有参构造2endl;}//定义展示函数void show(){coutname name gae ageendl;}};int main()
{Stu s1; //系统会自动调用该类中的无参构造函数s1.show();cout***************************\n;Stu s2(张三); //调用自定义的有参构造s2.show();cout***************************\n;Stu s3(张三, 18); //调用自定义的有参构造s3.show();return 0;
}
9 必须使用构造函数的初始化列表的情况
1、如果类的成员变量中有常成员变量对该成员的初始化工作必须使用初始化列表完成
2、如果类中有引用成员那么对该成员也必须使用初始化列表完成
3、如果构造函数的形参名和成员变量同名时可以使用初始化列表来解决
4、如果一个类中有另一个类的对象对该成员对象的初始化工作需要在初始化列表中显性定义该成员对象的有参构造否则系统会自动调用其无参构造
#include iostreamusing namespace std;//定义一个汽车类
class Car
{
private:string name;string color;
public:Car() {coutCar::无参构造endl;}Car(string n, string c):name(n), color(c){coutCar::有参构造endl;}
};//定义一个类
class Stu
{
private:const string name; //如果类中有const修饰的成员变量必须使用初始化列表完成对其进行初始化工作int age;int score; //引用成员 必须在构造函数的初始化列表中进行初始化工作Car c;public://无参构造函数Stu():name(二狗), score(*new int(520)), c(擎天柱,red){//this-name 二狗;this-age 100;coutStu::无参构造endl;}//定义有参构造函数Stu(string n, int score) :name(n), score(score){//this-name n;coutStu::有参构造1endl;}//定义有参构造//Stu(string n大毛, int a20) //带默认参数的构造函数Stu(string name, int age, int score) :name(name), age(age), score(score) //使用初始化列表完成对成员的初始化工作{//此处是给成员变量赋值而不是初始化//this-name n;//this-age a;coutStu::有参构造2endl;}//定义展示函数void show(){coutname name gae ageendl;}};int main()
{Stu s1; //系统会自动调用该类中的无参构造函数s1.show();cout***************************\n;int s 99;Stu s2(张三, s); //调用自定义的有参构造s2.show();cout***************************\n;Stu s3(张三, 18, s); //调用自定义的有参构造s3.show();return 0;
}
使用C手动封装一个顺序表包含成员指针变量成员变量N个
#include iostreamusing namespace std;
//类型重命名
using datatype int; //typedef int datatype;//定义一个顺序表类
class SeqList
{private:datatype *data; //指向堆区空间的指针int size 0; //数组的大小int len 0; //顺序表实际长度public://无参构造/*SeqList():data(new datatype[10]), size(10), len(0){cout无参构造endl;}*///有参构造SeqList(int s):data(new datatype[s]), size(s), len(0){cout有参构造endl;}//要实现的函数//判空函数bool empty(){return len0;}//判满函数bool full(){return lensize;}//添加数据函数bool add(datatype e){if(full()){return false;}len;data[len] e;return true;}//求当前顺序表的实际长度int length(){return len;}//任意位置插入函数bool insert_pos(int pos, datatype e){if(full()||pos0||poslen){return false;}for(int ilen;ipos;i--){data[i]data[i-1];}data[pos]e;len;return true;}//任意位置函数函数bool delete_pos(int pos){if(empty()||pos0||poslen){return false;}for(int ipos;ilen-1;i){data[i]data[i1];}len--;return true;}//访问容器中任意一个元素 atdatatype at(int index){if(index0||indexlen){return data[-1];}return data[index];}//君子函数二倍扩容void expend(){size *2;datatype *newdata new datatype[size];for(int i0;ilen;i){newdata[i] data[i];}delete []data;data newdata;}//释放顺序表void seqfree(){delete[]data;data NULL;size 0;len 0; }
};int main()
{SeqList S(5);S.add(1);S.add(2);S.insert_pos(1,3);cout 长度 S.length()endl;return 0;
}