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个字符长。