C++--类和对象


0、类、对象、成员函数、数据函数

首先,我们做一个简单的类比。

通常,一辆小汽车是从工程图样开始的,它们类似于设计房屋用的蓝图,可以通过蓝图去制造具有复杂功能的小汽车,我们可以将其类比于“类”。

我们不能驾驶小轿车的工程图样,也不能驾驶“类”,所以应该先根据工程图样制造一辆小轿车;同样,我们应该创建类的对象。

小汽车的每一项操作由对应的功能实现,这相当于类里面的成员函数。

小轿车具有许多属性,比如颜色,油量;在类里面,属性由类的数据成员来具体说明。

下面,通过七个例子对类进行初步剖析:


1、定义具有类的成员函数

#include<iostream>

using std::cout;
using std::endl;

class GradeBook//创建类
{
	//公共成员访问说明符
	public:
		void displayMessage()//成员函数
		{
			cout<<"Welcome to the Grade Book!"<<endl;
		 } 
};

int main(void)
{
	GradeBook myGradeBook;//根据类来实例化对象
	myGradeBook.displayMessage();//对象调用成员函数
	return 0;
}

定义具有一个成员函数的GradeBook类,然后创建一个GradeBook对象并调用它的成员函数。


2、定义一个具有形参的成员函数

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<string>
using std::string;
using std::getline;

class GradeBook
{
	public:
		void displayMessage(string courseName)//设置形参
		{
			cout <<"Welcome to the grade book for\n"<<courseName<<"!"<<endl;
		}
 } ;
 
 int main(void)
 {
 	string nameofCourse;
 	GradeBook myGradeBook;
 	
 	cout<<"Please enter the course name:"<<endl;
 	getline(cin,nameofCourse);//获取参数
 	cout<<endl;
 	
 	myGradeBook.displayMessage(nameofCourse);//参数传递
 	return 0;
 }

定义具有一个成员函数的GradeBook类,该成员函数接受一个形参。


3.数据成员、设置函数和一个获取函数的类

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<string>
using std::string;
using std::getline;

class GradeBook
{
	public:
		void setCourseName(string name)//设置-“更换器”
		{
			courseName = name;
		}
		string getCourseName()//获取-“访问器”
		{
			return courseName;
		}
		void displayMessage()
		{
			cout<<"Welcome to the grade book for\n"<<getCourseName()<<"!"<<endl; 
		}
	private://私有数据
		string courseName;
 } ;
 
 int main(void)
 {
 	string nameofCourse;
 	GradeBook myGradeBook;
 	
 	cout<<"Initial course name is:"<<myGradeBook.getCourseName()<<endl;
 	
 	cout<<"\nPlease enter the course name:"<<endl;
 	getline(cin,nameofCourse);
 	myGradeBook.setCourseName(nameofCourse);
 	
 	cout<<endl;
 	myGradeBook.displayMessage();
 	return 0;
 }

定义测试具有一个数据成员以及设置获取函数的类。


4.用构造函数初始化对象

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<string>
using std::string;

class GradeBook
{
	public:
		GradeBook(string name)
//构造函数:用于创建对象时初始化,无返回类型,不可以返回任何值
		{
			setCourseName(name);
		}
		void setCourseName(string name)
		{
			courseName = name;
		}
		string getCourseName()
		{
			return courseName;
		}
		void displayMessage()
		{
			cout<<"Welcome to the grade book for\n"<<getCourseName()<<"!"<<endl; 
		}
	private:
		string courseName;
 } ;
 
 int main(void)
 {
	GradeBook gradeBook1("C语言程序设计基础");//创建对象时初始化
	GradeBook gradeBook2("C++大学基础教程");
	
	cout<<"gradeBook1 created for course:"<<gradeBook1.getCourseName()
	<<"\ngradeBook2 created for course:"<<gradeBook2.getCourseName()<<endl;
	 
 	return 0;
 }

实例化GradeBook类的多个对象并在创建每个GradeBook对象时使用GradeBook构造函数指定课程名称。


5.一个类对应一个独立文件的可重用性

//GradeBook.h
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<string>
using std::string;

class GradeBook
{
	public:
		GradeBook(string name)
		{
			setCourseName(name);
		}
		
		void setCourseName(string name)
		{
			courseName = name;
		}
		
		string getCourseName()
		{
			return courseName;
		}
		
		void displayMessage()
		{
			cout<<"Welcome to the grade book for\n"<<getCourseName()<<"!"<<endl; 
		}
	private:
		string courseName;
 } ;
//GeadeBook.cpp
#include<iostream>
using std::cout; 
using std::endl;

#include"GradeBook.h"
 
int main(void)
 {
	GradeBook gradeBook1("C语言程序设计基础");
	GradeBook gradeBook2("C++大学基础教程");
	
	cout<<"gradeBook1 created for course:"<<gradeBook1.getCourseName()
	<<"\ngradeBook2 created for course:"<<gradeBook2.getCourseName()<<endl;
	 
 	return 0;
 }

GradeBook的类定义;
包含源自文件GradeBook.h的GradeBook类以让main函数使用。


6.接口的实现与分离

//GradeBook.h
#include<string>
using std::string;

class GradeBook
{
	public:
		GradeBook(string);
		void setCourseName(string);
		string getCourseName();
		void displayMessage();
	private:
		string courseName;
 }; 
//GradeBook.cpp
#include<iostream>
using std::cout;
using std::endl;

#include"GradeBook.h"
//成员函数名之前都添加了二元作用域分辨运算符"::";在类的外部定义类的成员函数时,在函数名前省略类名和二元作用域分辨运算符会导致编译错误
GradeBook::GradeBook(string name)
{
	setCourseName(name);
}

void GradeBook::setCourseName(string name)
{
	courseName = name;
}

string GradeBook::getCourseName()
{
	return courseName;
}

void GradeBook::displayMessage()
{
	cout<<"Welcome to the grade book for\n"<<getCourseName()<<"!"<<endl; 
}
//GradeBookTest.cpp
#include<iostream>
using std::cout; 
using std::endl;

#include"GradeBook.h"
 
int main(void)
 {
	GradeBook gradeBook1("C语言程序设计基础");
	GradeBook gradeBook2("C++大学基础教程");
	
	cout<<"gradeBook1 created for course:"<<gradeBook1.getCourseName()
	<<"\ngradeBook2 created for course:"<<gradeBook2.getCourseName()<<endl;
	 
 	return 0;
 }

指定类接口的函数原型的GradeBook的类定义;
GradeBook成员函数的定义描述了GradeBook类的实现;
接口和实现分离之后的GradeBook类的演示。


7.用设置函数确认数据的有效性

//GradeBook.h
#include<string>
using std::string;

class GradeBook
{
	public:
		GradeBook(string);
		void setCourseName(string);
		string getCourseName();
		void displayMessage();
	private:
		string courseName;
 }; 
//GradeBook.cpp
#include<iostream>
using std::cout;
using std::endl;

#include"GradeBook.h"

GradeBook::GradeBook(string name)
{
	setCourseName(name);
}

void GradeBook::setCourseName(string name)
{
	if(name.length() <= 25)
		courseName = name;
		
	if(name.length() > 25)
	{
		courseName = name.substr(0,25);//start at 0,length of 25
		
		cout<<"Name\""<<name<<"\"exceeds maximum length(25).\n" <<
		"Limiting courseName to first 25 characters.\n"<<endl;
	}		
}

string GradeBook::getCourseName()
{
	return courseName;
}

void GradeBook::displayMessage()
{
	cout<<"Welcome to the grade book for\n"<<getCourseName()<<"!"<<endl; 
}
//GradeBookTest.cpp
#include<iostream>
using std::cout; 
using std::endl;

#include"GradeBook.h"
 
int main(void)
 {
	GradeBook gradeBook1("C语言程序设计基础1 2 3 4 5 6 7 9 10");
	GradeBook gradeBook2("C++大学基础教程");
	
	cout<<"gradeBook1's initial course name is:"<<gradeBook1.getCourseName()
	<<"\ngradeBook.2's initial course name is:"<<gradeBook2.getCourseName()<<endl; 
	
	gradeBook1.setCourseName("C语言程序设计基础"); 
	
	cout<<"\ngradeBook1's course name is:"<<gradeBook1.getCourseName()
	<<"\ngradeBook2's course name is:"<<gradeBook2.getCourseName()<<endl;
	 
 	return 0;
 }

GradeBook的类定义;
GradeBook类定义的成员函数定义,其中使用了确认数据成员courseName长度有效性的一个设置函数;
创建和操作一个GradeBook对象,该对象中的课程名称限制到25个字符长。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会思想的苇草i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值