C++ 60分钟入门教程 - 6、C++类与对象
2014-10-19 23:31
295 查看
类、实例和对象
类是从C语言中的结构体演变而来,结构体的成员变量也就演化成类的成员变量,这时类只能存放数据。为了在类内部操纵这些数据,增加了成员函数的功能。所谓成员函数就是在类的内部定义,用来操作类的成员变量的函数。随后对成员变量和成员函数附上“私有”、“保护”和“公共”的访问权限,于是“类”便大致成型。事实上,C++中结构体的功能大致和类相当,也有了成员函数。“成员”是成员变量和成员函数的统称。类的出现带动设计风格的巨大变化,与传统设计方法相区别,称之为“面向对象设计”。
“类”和结构体一样,是一种自定义的数据类型,但不是基本类型。“实例”是用自己定义的“类”这个数据类型来定义的变量。这些一个一个的实例统称“对象”。另外,“继承”和“派生”是同一件事的不同说法,B类继承了A类,也就是说A类派生了B类。
class 类名 { //| class CSample { 访问符: //| public: 成员变量定义; //| int x1; 成员函数定义; //| CSample(); 访问符: //| protected: 成员变量定义; //| int a; 成员函数定义; //| float sum(float f1, float f2); 访问符: //| private: 成员变量定义; //| int m; 成员函数定义; //| double sum(double f1, double f2); ...... //| ...... } //| }
一般按习惯将private:定义部分放在紧靠类名下面,并且“private:”可以省略。“private:”下面定义的成员全是“私有”的,也就是只能在这个类的成员函数里可以使用,外部(包括派生的子类)不能使用。“public:”下面定义的成员,所有地方都能使用。“protected:”下面定义的成员,在派生的子类中则相当于“public”,其它地方则相当于“private”。
构造函数和析构函数
“构造函数”是类产生实例时被调用,进行初始化设置,是一个特殊的成员函数,函数名与类名相同,没有返回值。一般构造函数定义在“public:”下面,但有时为了阻止多个实例的产生而特意定义在“private:”或“protected:”下面。当初始化时没有什么需要设定时也可以不定义,编译时会自动生成一个默认的构造函数。构造函数的重载使得实例的生成灵活而且方便,默认的构造函数没有参数,且是定义在“public:”下面的。“析构函数”是类的实例被销毁时调用,进行最后的处理,例如释放动态分配的内存等。一般析构函数定义在“public:”下面,不需要时也可以不定义,编译时会自动生成一个默认的析构函数。析构函数的函数名与类名相同,前面有“~”返回值。
下面的例子演示构造函数和析构函数被调用的顺序。
#include <iostream>
using namespace std;
class CA {
int a;
public:
CA(){
a = 0;
cout << "构造函数: " << a << endl;
}
~CA(){
cout << "析构函数: " << a << endl;
}
void setA(int x) {
a = x;
}
void print() {
cout << "print: " << a << endl;
}
};
int main ( )
{
CA ca;
//ca.a = 10; //成员变量a是私有的,不能直接访问
ca.setA(10);
ca.print();
return 0;
}
运行结果:
构造函数:0
print:10
析构函数:10
成员函数的定义和声明分开
上面例子是将成员函数的定义和声明全写在类的定义体里面,更好的编程风格是分开来写,也就是类定义体里面只写成员变量和成员函数的声明,而成员函数的定义则写在类的定义体外。这样,类的定义体就可以移到“头文件”中去。在外部定义时,成员函数名前面要加上“类名::”。//==test.h==
class CA {
void a;
public:
CA();
~CA();
void setA(int x);
void print();
};
//==test.cpp==
#include <iostream>
#include "test.h";
using namespace std;
CA::CA(){
a = 0;
cout << "构造函数: " << a << endl;
}
CA::~CA(){
cout << "析构函数: " << a << endl;
}
void CA::setA(int x) {
a = x;
}
void CA::print() {
cout << "print: " << a << endl;
}
int main ( )
{
CA ca;
//ca.a = 10; //成员变量a是私有的,不能直接访问
ca.setA(10);
ca.print();
return 0;
}
运行结果:
构造函数:0
print:10
析构函数:10
生成实例的3种方法
了解生成实例的三种方法的细微区别是很重要的:申明为变量;
从无名对象复制;
申明为指针并动态生成。
注意:指针的成员用“->”,而不用“.”。
#include <iostream>
#include <string>
using namespace std;
int main ( )
{
string strA("C语言中文网"); //直接调用构造函数生成实例
cout << strA << " " << strA.length() << endl;
string strB; //先调用构造函数生成空字符串实例
strB = string("C++60分钟入门教程"); //再调用构造函数生成无名实例,然后复制给strB实例,无名实例立即销毁
cout << strB << " " << strB.length() << endl; //这和上面①的方法的结果相同
string *strC; //先定义一个指针,尚未分配空间
//动态调用构造函数生成实例后,再将实例地址赋给指针变量
strC = new string("http://see.xidian.edu.cn/cpp/biancheng/cpp/jichu/");
cout << *strC << " " << strC->length() << endl;
delete strC; //千万不要忘记释放
return 0;
}
运行结果:
C语言中文网 11
C++60分钟入门教程 17
http://see.xidian.edu.cn/cpp/biancheng/cpp/jichu/ 49
相关文章推荐
- C++ 60分钟入门教程 - 2、C++与C语言的区别
- C++ 60分钟入门教程 - 4、C++缺省参数和函数重载
- C++ 60分钟入门教程 - 5、C++引用
- C++ 60分钟入门教程 - 3、C++名字空间
- C++ 60分钟入门教程 - 7、C++成员函数和运算符的重载
- C++ 60分钟入门教程 - 1、绪论
- C++ 60分钟入门教程 - 8、C++继承
- JavaFx中文入门教程--JavaFx中的类和对象
- DirectX 3D编程入门教程一 D3D对象及设备
- 入门教程:C++中的const限定修饰符
- c/c++中结构体的入门教程
- JavaScript入门教程(5) js Screen屏幕对象
- Word入门动画教程82:图形对象的对齐与分布
- 挑战30天 C/C++ 入门极限系列教程-引言
- 挑战30天C/C++ 入门极限系列教程
- JavaScript入门教程(7) History历史对象
- 初学者必备:C++经典入门详细教程
- JAVA入门教程:对象、类、包和接口
- JavaScript入门教程(4) js浏览器对象
- SDL入门教程(五):6、对C++异常机制的思考,代码重写