一切皆对象,一个程序就是由一组对象组成的一个整体,程序的功能是通过对象之间传递消息来完成的。
例如:把大象装进冰箱需要几步,两者的解决方法:
面向过程:打开冰箱–>把大象塞进去–>关冰箱
面向对象:调用一个具有将大象塞进冰箱的类的功能
对象由共同特征和功能组成:
* 使用变量描述共同特征
* 使用函数描述功能
举例:
*学生的共同特征为:学号、姓名、班级……
*学生的功能为:吃饭、睡觉、学习……
对象类型的描述
(1) 使用结构体(struct)描述:
结构体中既可以有成员变量,也可以有成员函数。因此结构体可以来 表示对象类型,在C++中,对象的类型叫做类。
(2) 使用struct实现时间对象实例
#include
#include
using namespace std;
//使用结构体声明对象类型
struct Time{
//特征 ---- 变量
int hour;
int min;
int sec;
//功能 ---- 函数
void print_time(){
cout<<hour<<":"<<min<<":"<<sec<<endl;
}
void set_time(int h=15,int m=30,int s=25){
hour = h;
min = m;
sec = s;
}
void run(){
sec++;
if(sec==60){
sec = 0;
min++;
if(min==60){
min = 0;
hour++;
if(hour==24)
hour = 0;
}
}
}
};
int main()
{
//使用结构体声明对象,不需要加struct
Time t;
t.hour = 1;
t.min = 2;
t.sec = 3;
//访问成员函数
t.print_time();
t.set_time(23,59,49);
while(1){
t.run();
t.print_time();
sleep(1);
}
return 0;
}
(3)使用类(class)描述:
①:class也可以用来描述对象类型,语法和struct几乎一致。
②:具有访问属性:public — 公有属性、protected — 受保护属性、 private — 私有属性。
③:因struct声明的类中的成员默认是公开的,class声明的类中成员默认是私有的。所以 在C++中一般不使用struct而使用class来声明类。
(4)使用class实现时间对象实例
#include
using namespace std;
class Time{ //使用class声明对象类型
private: //私有
int hour; //特征 ---- 变量
int min;
protected: //受保护
int sec;
public: //公有
void print_time(){ //功能 ---- 函数
cout<<hour<<":"<<min<<":"<<sec<<endl;
}
void set_time(int h=15,int m=30,int s=25){
hour = h;
min = m;
sec = s;
}
void xxx(){
print_time();
}
void set_hour(int h=100){ //为类外需要访问的私有成员提供接口
hour = h;
}
int get_hour(){
return hour;
}
};
int main(void)
{
Time t;
//t.hour = 1; //类外不能访问私有成员和受保护成员
//t.sec = 1;
t.set_time(); //类外可以访问公有成员
t.print_time();
t.xxx();
return 0;
}
//字体颜色
1.创建对象
2.创建对象指针
#include
#include
using namespace std;
class A{
public:
//构造函数
A(){cout<<"我是A"<<endl;}
};
class Animal{
private:
int age;
float weight;
string name;//C++字符串类型(类)
//类类型成员(类可以嵌套)
A a;
public:
//构造函数,初始化对象
Animal(){
cout<<"我是Animal"<<endl;
//初始化成员
name = "xiaohua";
weight = 21.3f;
age = 5;
}
//构造函数的重载,构造函数的参数可以有默认值,但是不要重载冲突
Animal(int m_age,float m_weight=21.5f,string m_name="xiaohuang"){
cout<<"Animal(int,float,string)"<<endl;
name = m_name;
weight = m_weight;
age = m_age;
}
//成员函数
void show(){
cout<<name<<":"<<age<<":"<<weight<<endl;
}
};
int main()
{
//构造对象
//Animal *pa = new A; //堆空间 A加()也可以传参
//Animal an; //栈空间
Animal an(4,11.2,"xiaofei"); //构造对象可以传参数
an.show();
//delete pa;
return 0;
}
#include
using namespace std;
class Animal{
private:
int age;
float weight;
string name;//C++字符串类型(类)
int #//引用成员
const int height;//const成员
public:
//构造函数,初始化参数列表(在参数列表之后,构造函数之前)
Animal(int m_age,float m_weight,string m_name,int m_height):
age(m_age),weight(m_weight),name(m_name),num(age),height(m_height){
cout<<"Animal(int,float,string,int)"<<endl;
}
//成员函数
void show(){
cout<<name<<":"<<num<<":"<<height<<endl;
}
};
int main()
{
Animal an(5,11.2f,"ahuang",30);
an.show();
return 0;
}
#include
#include
using namespace std;
//前置声明
class Animal;
void show_Animal(Animal &an);
class Animal{
private:
string name;
int age;
double weight;
public:
//构造函数,且参数与成员变量相同,所以使用this
Animal(string name,int age,double weight){
cout<<"Animal()"<<endl;
this->name = name;
this->age = age;
this->weight = weight;
}
//成员函数
Animal *show(){
show_Animal(*this); //作为函数参数,将对象传过去
cout<<this->name<<":"<<this->age<<":"<<this->weight<<endl;
return this; //返回调用该函数的本对象
}
void run(){
cout<<"Animal run!"<<endl;
}
};
//全局函数
void show_Animal(Animal &an)
{
cout<<"show_Animal()"<<endl;
an.run();
}
int main()
{
Animal *pa = new Animal("xiaohua",2,24.4);
//pa->show()->show()->run(); //this作为返回值,可重复调用
pa->show();
delete pa;
return 0;
}
概念:
①是一个特殊的函数,函数名和类名相同,但是前面要加一个~,不能有任何参数,也没有返回值;
②析构函数在对象被销毁释放时会被自动调用一次;
③如果类中没有析构函数,编译器会自动生成一个什么也不做的析构函数。
用法:如果在销毁对象时需要释放资源,比如动态内存在构造函数中申请了动态内存(new),在析构函数中使用(delete)。
#include
#include
using namespace std;
class Date{
private:
int year;
int month;
int day;
char *str; //独立内存
public:
Date(int year=2020,int month=9,int day=29,const char *str="welcome"){
this->year = year;
this->month = month;
this->day = day;
this->str = new char[strlen(str)+1];
strcpy(this->str,str);
}
~Date(){ //析构函数
delete[] this->str;
}
Date(const Date &dt){ //拷贝构造函数
this->year = dt.year;
this->month = dt.month;
this->day = dt.day;
//重新分配空间
this->str = new char[strlen(dt.str)+1];
strcpy(this->str,dt.str);
cout<<"Date(const Date &dt)"<<endl;
}
void set_str(const char *str){
strcpy(this->str,str);
}
void show(){
cout<<this->str<<":"<<this->year<<"-"<<this->month<<"-"<<this->day<<endl;
}
};
int main(void)
{
Date dt(2018,8,8);
//调用语法
Date dt1 = dt;
dt.show();
dt1.show();
//修改dt对象的str,不会影响dt1对象的数据
dt.set_str("hello");
dt.show();
dt1.show();
return 0;
}