C++中的类与对象 标签(空格分隔): c++
作者:陈小默
- C中的类与对象
- 定义类
- 创建头文件
- 类和结构体
- 访问控制
- 作用域解析运算符
- 实现类成员
- 默认的内联方法
- 创建对象
- 定义类
开发环境:Visual Studio 2010
定义类 通常,C++程序将接口(类定义)放在头文件中,并将实现(类方法的代码放在源代码文件中),本文章以一个学生的例子来完成代码。
学生定义:记录三门课程(语文,英语,数学)的成绩,能够查看学生的平均成绩
创建头文件
现在创建名为
student.h
的头文件//student.h -- Student class interface
//version 00
#ifndef STUDENT_H_
#define STUDENT_H_#include class Student{ //class declaration
private:
std::string name;
int ch;
int en;
int math;
float average;
void count(){
average = (ch + en + math+0.0F)/3;
}
public:
Student();
//构造函数
~Student();
//析构函数
void setName(std::string name);
void setChScore(int score);
void setEnScore(int score);
void setMathScore(int score);
void show();
};
#endif
注意:类定义和结构体定义一样,要在最后加上
;
(分号)类和结构体
关键字
class
指明这些代码定义了一个类设计,在这里class
和typename
不是同义词,不能使用typename
代替class
类描述看上去很像是包含成员函数以及public和private可见性标签的结构声明。实际上,C++对结构进行了扩展,使之具有相同的特性。它们之间唯一的区别就是,结构体的默认访问类型是public,而类为private。C++程序猿通常使用类来实现类的描述,而把结构体作为纯粹的数据对象表示。
访问控制 在C++程序中通常使用访问控制关键字来保证自身属性的可见性。常见的三个关键字为
private
,public
,protected
关键字 | 含义 |
---|---|
private | C++中的默认访问权限,也就是说上述student.h 文件中的private关键字可以省略。其含义表示为只有该对象自身可以访问这些属性或者方法,被private修饰的属性和方法对于外部来说不可见 |
public | 公有权限,表示被public修饰的属性和方法可以被外部程序直接调用 |
protected | 受保护的权限,表示这些属性和方法仅仅能被该类和派生类的内部访问,也就是说,对于外部世界来说,保护成员的行为与private相同,对于派生类来说,保护成员的行为和public相同 |
::
)。该符号的作用是用来标识一个函数所属的类,例如当我们输入Student::average()
时。表示我们访问的average()
方法属于Student
类而不是其他的类。 但是在一个
Student
类的内部我们并不需要使用使用作用域解析运算符就能访问average()
方法,这是因为在类的内部自身所定义的所有方法对自身来说都是可见的。 对于一个方法名称来说,
Student::average()
是方法的函数限定名(全称),而average()
方法属于非限定名(简称),当程序对于一个函数来源无异议时(没有重名方法),可以使用简称。实现类成员 现在我们创建一个C++文件
student.cpp
//student.cpp -- implementing the Student class
//version 00
#include "stdafx.h"
#include "student.h"Student::Student(){
}
Student::~Student(){
}
void Student::setChScore(int score){
Student::ch = score;
}
void Student::setName(std::string n){
Student::name = n;
}
void Student::setEnScore(int score){
en = score;
}
void Student::setMathScore(int score){
math = score;
}
//不需要知道这个方法的具体实现,后面会介绍,本节重点是类与对象
void Student::show(){
Student::count();
ios_base::fmtflags orig = cout.setf(ios_base::fixed,ios_base::floatfield);
std::streamsize prec = cout.precision(1);
cout<
注意这个实现的
Student::setChScore(int score)
中我们在使用ch
参数时使用了作用于解析运算符,其实在类的内部我们可以直接使用简称,所以在后续的方法中我们使用了非限定名。默认的内联方法
我们在类的定义中声明并定义了一个
count()
方法,由于其位于声明中,编译器将其编译为内联方法。一般内容简单的方法都可以作为内联方法。如果我们并不想直接在定义中声明并定义一个内联方法,我们也可以在实现时给方法添加inline
关键字。比如inline void count(){
average = (ch + en + math+0.0F)/3;
}
但是我们在声明外定义内联函数时必须注意C++中的一个规则:要求内联函数在每一个使用它的源文件中均由定义。也就是说我们需要在每一个使用该方法的文件中定义该方法,很明显我们并不想这样做,所以最好的实现就是在声明中实现定义方法。
创建对象 当我们在使用一个类的实例对象时需要用到一个关键字
new
,这个关键字和C语言中的malloc
关键字类似,都是用来在堆内存中为数据分配一段空间。 我们在main方法中举个例子
//visual studio 2010 -- main program
#include "stdafx.h"
#include "student.h"int _tmain(int argc, _TCHAR* argv[]){
Student *jack = new Student();
jack->setName("jack");
jack->setChScore(98);
jack->setMathScore(100);
jack->setEnScore(92);
jack->show();
delete jack;
return 0;
}
【C++|C++中的类与对象】输出结果:
jack 同学的语文成绩为98分,数学成绩为100分,英语成绩为92分,平均成绩96.7分
请按任意键继续. . .
温馨提醒:记得养成良好习惯,在对象不用后要使用delete关键字销毁对象。
推荐阅读
- C++|[C++] C++11中的线程库
- C++|线程库(C++11)
- C++语言|【C++碎碎念】C++11新特性(声明、智能指针、右值引用、lambda表达式)
- c语言|数组与指针超强巩固练习题——搞清各种数组与指针的关系
- c语言|通讯录的思路讲解和代码实现
- C语言|【C语言】动态内存管理详解
- c语言|C语言之动态内存管理
- c语言|C语言中的指针(进阶)
- c语言|C语言中的字符串函数和字符函数