C++类别(建构函数、初值串列、EXPLICIT指示词)

类别-

类别(class) 是物件(object) 的模板,物件的所有功能都由类别设置。

典型的类别设计如下

class class_name {
access_label_1:
    // member

access_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
$

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值