用构造函数初始化对象
1、每个类都提供构造函数,用于在创建类对象时初始化该对象。构造函数的名字必须与类名相同。
2、构造函数无返回值,通常声明为public类型。
3、C++在创建每个对象时都要调用构造函数,以确保对象在使用前被正确初始化。
4、不接收任何实参的构造函数为默认构造函数。
将类放在单独的文件中以增强重用性
1、正确封装的类定义能够被全世界的程序员使用。
2、类的定义通常放在扩展名为.h的文件中。
3、如果类的实现改变了,则类的客户应该不需要改变。
4、接口定义并标准化了事物间的交互方法。
5、类的public接口描述了可供类的客户使用的public成员函数。接口描述了类的客户可以使用哪些服务以及如何请求这些服务,但是没有描述类是如何执行这些服务的。
将类的接口与实现分离
1、将类的定义与实现分离,使得程序易于修改。
2、函数原型包含函数名、返回值类型和函数要接收的形参个数、类型以及顺序。
3、如果定义了类并用函数原型声明了它的成员函数,则应该在一个单独的源代码文件中定义成员函数。
//类的定义和其成员函数的定义要分开。
4、在类外定义的成员函数,必须在函数名前加上类名和二元作用运算符。
接口:定义并标准化了事物之间的交互方法。
类的接口:描述了类的客户可以使用哪些服务以及如何请求这些服务,但是没有描述类是如何执行这些服务的,
类的接口由类的public成员函数(也称为类的公共服务)构成。
将接口与实现分开:将成员函数放在类外定义,这样可以对客户编写的源代码隐藏实现细节,确保程序员不会编写依赖于类的实现细节的客户代码。
GradeBook类的测试
#include<iostream>
#include"GradeBook.h"
using namespace std;
int main(){
GradeBook gradeBook1("CS101 Introduction to C++ programming");//定义两个类对象,及其字符串
GradeBook gradeBook2("CS102 Data Structures in C++");
cout << "GradeBook1 created for book: " << gradeBook1.getCourseName() << "!" << endl;//用类对象调用类的成员函数
cout << "GradeBook2 created for book: " << gradeBook2.getCourseName() << "!" << endl;
gradeBook1.setCourseName("CS101 C++ programming");
cout << "\ngradeBook1's course name is: " << gradeBook1.getCourseName()
<< "\ngradeBook2.getCourseName is: " << gradeBook2.getCourseName()<<endl;
}
定义类的成员函数
//在单独的源代码文件中定义成员函数
#include<iostream>
#include"GradeBook.h"//include defination of class GradeBook
using namespace std;
//如果不在各个成员函数前加上GradeBook:: 那么编译器将会把这些成员函数当做像main函数一样的松散函数(全局函数)来处理
GradeBook::GradeBook(string name){//用string类型的形参初始化构造函数
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, end at 25
//substr将一个已经有string的对象中的一部分字符串复制到一个新创建的string对象中,并返回这个对象,第一个实参是指字符串的起始位置,第二个实参是指指定要复制的字符个数。
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;
}
GradeBook类定义
//头文件中指定类的private数据成员,编译器必须知道类的数据成员才能确定应该为该类的每个对象预留多大的内存空间
//GradeBook类的定义,包含指定类的接口的函数原型
#include<string>
using namespace std;
class GradeBook{
public:
GradeBook(string);//构造函数无返回值
void setCourseName(string);
//函数原型中的形参名是任意的,编译器忽略这些形参名,但是为了便于理解,一般都会加上
string getCourseName();
void displayMessage();
private:
string courseName;
};