C++类和对象实例解析(二)_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++编程语言有所帮助,也希望大家可以继续关注!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索类和对象
C获取对象类型
c语言高级实例解析、c语言实例解析精粹pdf、c语言高级实例解析pdf、c语言实例解析精粹、易语言 解析html实例,以便于您获取更多的相关知识。

时间: 2024-09-24 02:27:15

C++类和对象实例解析(二)_C 语言的相关文章

浅谈C++中派生类对象的内存布局_C 语言

主要从三个方面来讲: 1 单一继承 2 多重继承 3 虚拟继承 1 单一继承 (1)派生类完全拥有基类的内存布局,并保证其完整性. 派生类可以看作是完整的基类的Object再加上派生类自己的Object.如果基类中没有虚成员函数,那么派生类与具有相同功能的非派生类将不带来任何性能上的差异.另外,一定要保证基类的完整性.实际内存布局由编译器自己决定,VS里,把虚指针放在最前边,接着是基类的Object,最后是派生类自己的object.举个栗子: class A { int b; char c; }

详解C++编程中类的声明和对象成员的引用_C 语言

C++类的声明和对象的创建 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化.每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数. 与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间.而对象是类这种数据类型的一个变量,占用内存空间. 类的声明 类是用户自定义的类型,如果程序中要用到类,必须先进行声明,或者使用已存在的类(别人写好的类.标准库中的类等),C++语法本身并不提供现成的类的名称.结构和内容. 一个简

C++中的类模板详解及示例_C 语言

C++中的函数模板 对于类的声明来说,也有同样的问题.有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: 复制代码 代码如下: class Compare_int{ public:  Compare(int a,int b)  {   x=a;   y=b;  }   int max()  {   return (x>y)?x:y;  }  int min()  {   return (x<y)?x:y;  } private:  int x,y;}; 其作用是

浅谈C++基类的析构函数为虚函数_C 语言

1.原因: 在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类. 2.例子: (1). #include<iostream> using namespace std; class Base{ public: Base() {}; ~Base() {cout << "Output from the destructor of class Base!" << endl;}; void DoSomething() { cout

深入分析C++派生类中的保护成员继承_C 语言

protected 与 public 和 private 一样是用来声明成员的访问权限的.由protected声明的成员称为"受保护的成员",或简称"保护成员".从类的用户角度来看,保护成员等价于私有成员.但有一点与私有成员不同,保护成员可以被派生类的成员函数引用. 如果基类声明了私有成员,那么任何派生类都是不能访问它们的,若希望在派生类中能访问它们,应当把它们声明为保护成员.如果在一个类中声明了保护成员,就意味着该类可能要用作基类,在它的派生类中会访问这些成员.

C语言柔性数组实例详解_C 语言

本文实例分析了C语言柔性数组的概念及用法,对于进一步学习C程序设计有一定的借鉴价值.分享给大家供大家参考.具体如下: 一般来说,结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小.柔性数组到底如何使用? 不完整类型 C和C++对于不完

C语言实现xml构造解析器_C 语言

纯C实现xml构造解析器,所有实现只有一个.c一个.h文件组成,简单易用,易于扩展. #include <string.h> #include <stdio.h> #include <stdlib.h> #include "sxml.h" #define LUA_SCRIPT "function fun()\n\ int a;\n\ a = 10;\n\ return a;\n\ end" int main() { sxml_fi

Xml WebService完全实例解析(二)

web|xml 上篇文章介绍了些webservice的基本特性和我们例子的结构,这篇文章我们将开始具体的代码编写工作.       这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只将简略介绍.       在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件->新建->项目->C#->Web服务应用程序)

解析C++中指向对象的指针使用_C 语言

C++指向对象的常指针将指针变量声明为const型,这样指针值始终保持为其初值,不能改变. 如: Time t1(10,12,15),t2; //定义对象 Time * const ptr1; //const位置在指针变量名前面,规定ptr1的值是常值 ptr1=&t1; //ptr1指向对象t1,此后不能再改变指向 ptr1=&t2; //错误,ptr1不能改变指向 定义指向对象的常指针的一般形式为: 类名 * const 指针变量名; 也可以在定义指针变量时使之初始化,如将上面第2,