类别-
类别(class) 是物件(object) 的模板,物件的所有功能都由类别设置。
典型的类别设计如下
class class_name {
access_label_1:// memberaccess_label_2:// member
};
利用关键字(keyword) class宣告类别名称,其后的大括弧为类别的宣告内容,里头用存取标签(access label) 区分成员(member) 的权限。存取标签有三种,分别是public、private与protected,这三个标签也都属于关键字。
public成员可以由所有使用物件的地方自由呼叫,private成员则限制在类别中呼叫,也就是类别的成员才可以使用private成员,protected成员的使用范围与private成员相同,但是private成员不能被继承(inheritance ) ,protected成员则可以被继承。
如果在类别宣告中没有写存取标签的话,预设为private。
使用private成员可达到把资料封装(encapsulation) 的目的,此为物件导向程式设计(object-oriented programming) 的主要特性之一。
成员可以是变数(variable) 或函数(function) ,前者称为资料成员(data member) ,这是专属于物件的变数,后者则称之为成员函数(member function) ,这也是专属于物件的函数,需要透过物件进行呼叫。
注意,大括弧最后的分号是必须的。举一例如下
#include <iostream>class Demo {
public:int a;int b;int do_something() {return a + b;}
};int main() {Demo d;d.a = 11;d.b = 22;std::cout << d.do_something() << std::endl;return 0;
}
此例宣告了类别Demo,里头有三个成员,两个int变数与一个回传int的函数
class Demo {
public:int a;int b;int do_something() {return a + b;}
};
然后在main()宣告Demo型态的变数d,此时Demo型态的物件d已建立,接着再用小数点运算子设定两个资料成员
Demo d;
d.a = 11;
d.b = 22;
编译执行,结果如下
$ g++ u09.cpp
$./a.out 复制代码
33
$
我们是把成员函数的定义放到类别宣告中,成员函数的定义可以移出类别宣告,这样的类别宣告就是单纯的宣告
class Demo {
public:int a;int b;int do_something() ;
};
这样成员函数的实作就移出类别宣告外,在函数名称前要加上类别名称与作用域运算子,如下
int Demo::do_something() {return a + b;
}
通常类别的宣告会放到标头档里,而成员函数的实作会放到实作档中。
下面我们分成数个部分介绍C++ 的类别
建构函数
建构函数(constructor) 是一种特别的成员函数,与类别同名并且没有回传值(return value) ,因为这是在类别实际建立物件时执行的函数。如果自己没有定义建构函数,编译器(compiler) 会补上预设的建构函数。
预设的建构函数是没有参数(parameter) 的函数版本,我们同样举个没有参数的建构函数例子如下
#include <iostream>class Demo {
public:int a;int b;Demo() {std::cout << "constructor.." << std::endl;a = 22;b = 33;}int do_something() {return a + b;}
};int main() {Demo d;std::cout << d.do_something() << std::endl;return 0;
}
此例的建构函数被呼叫时,会先印出英文讯息,然后设定两个资料成员
编译执行,结果如下
$ g++ u0901_1.cpp
$./a.out 复制代码
构造函数..
55
$
下例将Demo改写成Demo2,增加另一个有参数的建构函数
#include <iostream>class Demo2 {
public:int a;int b;Demo2() {a = 22;b = 33;}Demo2(int pa, int pb) {a = pa;b = pb;}int do_something() {return a + b;}
};int main() {Demo2 d(33, 44);std::cout << d.do_something() << std::endl;return 0;
}
新版本的建构函数有两个参数,分别用来设定两个资料成员
Demo2(int pa, int pb) {a = pa;b = pb;
}
这样宣告Demo型态的变数d时,就要用小括弧加上参数列(parameter list)
$ g++ u0902.cpp
$./a.out 复制代码
构造函数..
99
$