在基于对象的程序设计方法中,我们通过一组数据抽象来建立问题的模型,在C++中我们把这些抽象称为类。比如图书馆资料登记/借阅系统就是由类的抽象实例(比如书名、借阅者、还书时间等)之间的相互作用表现出来,以此来表示出图书馆的抽象概念。
一、类的定义
在C++中,类的定义方式与结构体类似,只是使用class关键字定义。通常先写接口再实现。所谓的接口就是类头加“{}”,实现就是中括号内的内容。
class 类名 { 数据和方法的定义 };//注意类的结尾要有分号 |
类 | 类头 | Class 类名 |
类体 | { 属性;//即变量,成员变量 方法;//即函数,类内的描述方法 }; |
类的定义包含两部分,类头和类体。类头由class关键字和类名构成。类体由一组大括号“{}”和一个分号“;”构成,类体中通常定义类的数据和方法,其中数据即变量,描述的是类的特征,也被称之为属性或数据成员,数据成员可以是任何数据类型,但不能用auto、reqister或extern说明;不能在类的声明声明中给数据成员进行初始化,因为声明的类没有空间。方法实际上是类中定义的函数,也称之为方法,描述的是类的行为。这些操作称为成员函数或方法。
二、命名规则
- 在C++中定义类时,类名通常以大写字母C开头(CUser、CXx),成员变量用“m_”为前缀,这已是一个约定俗成的习惯。
当把数据成员_size放在类的私有区内时,我们要声明一个公有成员函数,以便允许用户访问它的值。但C++不允许成员函数与数据成员共享同一个名字,所以一般在数据成员名字前面加一个下划线 "_" ,比如“_size”。因此我们有了公有函数size()和私有数据成员_size.
三、成员函数的定义方式(类内\外定义)
在定义类的方法时,方法的定义可以直接放置在类体内,也可以将方法的定义放置在类体之外,在定义类时只提供方法的原型。当方法的定义放置在类体外时,方法名称前需要使用类名和域限定符::来标记方法属于哪一个类。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class CUser
{
private:
int m_num;
char m_Username[120]; //成员变量
char m_Password[120];
char* NAME;
public:
bool Logic(); //函数成员在类外定义
bool Logic(char* name, char* num) //成员函数在类内定义
{
if (strcmp(name, "hello") == 0 && strcmp(num, "123456") == 0)
{
cout << "成员函数结果:登录成功!" << endl;
cout << endl;
cout << "字符串输出的第一种形式:" << endl;
strcpy(m_Username, "变量为字符型数组的用strcpy可赋值字符串");
cout << m_Username << endl;
cout << endl;
cout << "字符串输出的第二种形式:" << endl;
cout << "单个数组输出单个字符";
m_Username[0] = 'h';
cout << m_Username[0] << endl;
cout << endl;
cout << "字符串输出的第三种形式:" << endl;
NAME = "采用指针型变量可赋值字符串";
cout << NAME << endl;
cout << endl;
return true;
}
else
{
cout << "登录faile" << endl;
return false;
}
}
void setNum(int x) //函数成员在类内定义
{
m_num = x;
cout << "Num =" << m_num << endl;
}
};
bool CUser::Logic() //成员函数
{
cout << "Username :" << endl;
cin >> m_Username ;
cout << "Password :" << endl;
cin >> m_Password;
if (strcmp(m_Username, "hello") == 0 && strcmp(m_Password, "123456") == 0)
{
cout << "登录成功" << endl;
return true;
}
else
{
cout << "登录faile" << endl;
return false;
}
}
int main()
{
//实例化成员函数
CUser Bob;
Bob.Logic((char*)"hello",(char*)"123456");
Bob.Logic();
getchar();
return 0;
}
结果:
注:在定义类的成员变量或数据成员时不能够对其进行初始化。
四、对象的定义及引用
对象的引用
是指对对象成员的引用,不论是数据成员,还是成员函数,只要是公有的,就可以被外部函数直接引用;
引用方式:
对象名.数据成员名 对象名.成员函数名(实参表) 或者当对象是指针时: 对象名->数据成员名 对象名->成员函数名(实参表) |
例如:
int main()
{
//实例化对象
CStu *p = new CStu; //申请内存,对象为指针形式
p->setNum(34);
p->setName((char*)"Lily");
cout << "num =" << p->getNum() << endl;
cout << "num =" << p->getName() << endl;
delete p; //释放内存
//实例化对象
CStu Lucy;
Lucy.setNum(100);
Lucy.setName((char *)"Lucy");
cout << "Lucy.num = " << Lucy.getNum() << endl;
cout << "Lucy.name = " << Lucy.getName() << endl;
getchar();
return 0;
}
拷贝方式:值拷贝
注;
- 在使用对象赋值时,两个对象的类型必须相同
- 两个对象之间的赋值,仅仅使这些对象中的数据相同,而两个对象仍然是独立的对象,它们有各自的数据成员。
- 将一个对象的赋值给另一个对象时,多数情况下都是成功的,但当类中存在指针时,可能会产生错误