C++类和对象实例解析(二)
C++既是面向对象也是面向过程的语言,在这里就有一个重要的概念——类。
何谓类?类是对对象的一种抽象,举例来讲:每一个实实在在存在的人就是一个对象,人有很多共同的特征(一个头,两条腿,能走,能跑),这具有共同特征的人就成为一个类。类是一个抽象的名词,每一个人(即对象)是这个类的实例。
对象间具有的共同特征是对象的属性和行为。录像机是一个对象,它的属性是生产厂家、牌子、重量、颜色等等,它的行为就是它的功能,如录像、放像、快进、倒退等操作。
C++程序中,需要先定义一个类,形如:
Class 类名
{
定义变量;
….
定义函数
}
在类体中时成员列表,包括数据和操作数据的函数,即数据成员、成员函数。这体现了类的封装性和信息的隐蔽性。
成员函数一般在类体中声明,在类体外定义。
构造函数:对对象进行赋值
析构函数:在函数功能域结束时,释放对象成员的空间。
内联函数:为了节省函数调用的时间
完成各种功能函数…….
定义对象就需要对类进行实例化。形如:类名对象名
类是一个抽象,它不占任何内存,只有当其实例化成为对象之后,才会给其分配空间。
计算机中就是用对象来描述大千世界的事物。对象之间通过消息建立联系,借助函数完成各种各样的功能。
简单的说,这就是对象和类。
下面通过实例理解
【2-1】定义一个日C++类和对象期类date,该类对象存放一个日期,可以提供的操作有:取日期值,取年份,提取月份,提取日期以及设计日期值。
【分析】这个程序需要先定义一个类类型,这个类的数据成员有year,month,day,并且将其设计为private访问权限。还需要有5个成员函数,分别为:
void getdate(); //取日期值,格式为“year-month-day” int getyear(); //取年份 int getmonth(); //取月份 int getday(); //取日期 void setdate(int y,int m,int d); //设置日期值 程序代码如下: #include <iostream> using namespace std; class date { public: void getdate(); int getyear(); int getmonth(); int getday(); void setdate(int y,int m,int d); private: int year,month,day; }; int date::getyear(){ return year; } int date::getmonth(){ return month; } int date::getday(){ return day; } void date::getdate() { cout<<"today is:"<<year<<"-"<<month<<"-"<<day<<endl; } void date::setdate(int y,int m,int d) { year=y; month=m; day=d; } int main() { date d; d.setdate(2011,2,1); cout<<"year="<<d.getyear()<<endl; cout<<"month="<<d.getmonth()<<endl; cout<<"day="<<d.getday()<<endl; d.getdate(); return 0; }
【总结】这是一个最简单的类程序,但其中也存在不少问题。比如,如果没有setdate()函数,就无法对对象赋初值,而且必须按照特定的格式对对象进行设置初值。这个问题就应该采用构造函数来进行对象初始化。
【2-2】对例【2-1】进行改进,要求使用构造函数进行对象初始化,并且格式要不一致。
【分析】这个例子需要使用构造函数,并且要用到构造函数重载,使用默认参数值的构造函数和拷贝构造函数。
程序代码如下:
#include <iostream> using namespace std; class date { public: date(int y=0,int m=0,int d=0) { year=y; month=m; day=d; } date(date &d) { year=d.year; month=d.month; day=d.day; } void getdate() { cout<<"today is:"<<year<<"-"<<month<<"-"<<day<<endl; } int getyear() { return year; } int getmonth() { return month; } int getday() { return day; } private: int year,month,day; }; int main() { date d1(2011,2,1),d2,d3(d1); d1.getdate(); d2.getdate(); d3.getdate(); return 0; }
【总结】程序中的对象d1有完整的实参表,则调用构造函数来进行对象初始化;对象d2没有实参表,系统同样自动调用构造函数进行对象初始化,只不过形参的值采用默认参数值进行初始化。对于对象d3,则采用拷贝构造函数进行初始化。
【2-3】输入数据到数组内求和、最大值、最小值与平均值后输出,将成员函数定义在类外。
【分析】这个程序时对C语言中所学内容的一个总结,是从面向过程到面向对象的跨越。这个类的数据成员应该包括数组。成员函数应该有数组输入函数、数组输出函数、求和函数、最大值函数、最小值函数和求平均值函数。
程序代码如下:
#include <iostream> using namespace std; #define N 10 class array { public: void input(); void output(); int max(); int min(); int sum(); float average(); private: int a[N],maxnumber,minnumber,sumnumber; float avenumber; }; void array::input() { int i=0; cout<<"Please input "<<N<<" numbers:"<<endl; for(i=0;i<N;i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } } void array::output() { int i=0; cout<<"array a is:"<<endl; for(i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; } int array::max() { int i; maxnumber=a[0]; for(i=1;i<N;i++) if(maxnumber<a[i]) maxnumber=a[i]; return maxnumber; } int array::min() { int i; minnumber=a[0]; for(i=1;i<N;i++) if(minnumber>a[i]) minnumber=a[i]; return minnumber; } int array::sum() { int i; sumnumber=a[0]; for(i=1;i<N;i++) sumnumber+=a[i]; return sumnumber; } float array::average() { float ave=static_cast<float>(sumnumber/N); return ave; } int main() { array a; a.input(); a.output(); cout<<"The max number is "<<a.max()<<endl; cout<<"The min number is "<<a.min()<<endl; cout<<"The sum number is "<<a.sum()<<endl; cout<<"The average number is"<<a.average()<<endl; return 0; }
【总结】从上面的程序可以看出,类array里面包括对数组的各种操作,包括求和,求最大值,求最小值以及求平均值等。
【2-4】设计一个表示猫的类,包括猫的颜色、体重、年龄等数据,具有设置猫的颜色,修改和显示猫的体重、年龄等操作。
【分析】设计猫类的类名为Cat,此类有3个数据成员,颜色用string类表示,可以存放汉字,体重用实数类型表示,年龄用整数型表示,为了保护数据的安全性,3个数据成员全部为私有性。对猫的属性数据的设置和修改,全部为公有函数。
程序代码如下:
#include <iostream> #include <string> using namespace std; class Cat { public: Cat(string c="red",float w=1,int a=1); string get_color(); float get_weight(); int get_age(); void display(); private: string color; float weight; int age; }; Cat::Cat(string c,float w,int a) { color=c; weight=w; age=a; } string Cat::get_color() { return color; } float Cat::get_weight() { return weight; } int Cat::get_age() { return age; } void Cat::display() { cout<<"The color of this cat is "<<get_color()<<endl; cout<<"The weight of this cat is "<<get_weight()<<endl; cout<<"The age of this cat is "<<get_age()<<endl; } int main() { Cat c1,c2("yellow",1,2); cout<<"c1 is:"<<endl; c1.display(); cout<<"c2 is:"<<endl; c2.display(); return 0; }
【总结】从上面的程序可以看出,构造函数可以用类对对象进行初始化,并且构造函数可以进行重载。
希望本文可以对大家学习c++编程语言有所帮助,也希望大家可以继续关注!
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
- 这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25
- 这篇文章主要介绍了c++优先队列(priority_queue)用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25