曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 10393|回复: 0
打印 上一主题 下一主题

基本类概念及类成员的访问

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-7-11 13:08:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简单类声明示例:
[C++] 纯文本查看 复制代码
class queue {
                int q[100];
                int sloc, rloc;
                
        public: 
                void init();
                void qput(int i);
                int qget();
};

class 是声明类的关键字。queue 是一个类,类中声明的 q[100] 数组和 sloc, rloc 是成员变量;init(), qput(), 和 qget() 是成员函数。笼统地说,组成类的函数和变量都可以称为类的成员。注意上面声明类的末位不要遗漏 ';' 符号。

类可以包含 公有成员私有成员。在默认情况下,类的成员是私有的,比如上面的成员变量 q, sloc 和 rloc 都是私有的。私有成员只能被类 queue 中的成员访问,而程序中其它代码是不能访问这些变量的。如下面程序所示:
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;

class queue {
    int q[100];
    int sloc, rloc;

public:
    void init();
    void qput(int i);
    int qget();
};

void queue::init()
{
    rloc = sloc = 0;
}

void queue::qput(int i)
{
    if (sloc == 100) {
        cout << "Queue is full.\n";
        return ;
    }
    sloc++;
    q[sloc] = i;
}

int queue::qget()
{
    if (rloc == sloc) {
        cout << "Queue underflow.\n";
        return 0;
    }
    rloc++;
    return q[sloc];
}

int main(void)
{
    queue a, b;
    a.init();
    b.init();

    cout << a.sloc << " ";
    cout << b.sloc << "\n";

    return 0;
}

上面程序在 main() 中定义了两个 queue 对象 a 和 b 。这里尝试直接在 main() 中访问类中的私有成员变量 sloc,那么在编译时会看到编译器发出的错误报告:
$ g++ class.cc -o class
class.cc: In function ‘int main()’:
class.cc:6: error: ‘int queue::sloc’ is private
class.cc:45: error: within this context
class.cc:6: error: ‘int queue::sloc’ is private
class.cc:46: error: within this context
在上面对类的成员函数 init(), qput(int i), 和 qget() 的实现中看到符号" ::" --- 它被称为作用域解析运算符。也就是说,它告诉编译器函数这些函数是属于类 queue 的。换句话说, :: 表明函数 qput() 在类 queue 的作用域之内。

关键字 public 用来声明类的公有成员。如果要将类的一部分成员对外部代码开放(程序中其他代码也可以访问这些成员),那么必须用 public 关键字来声明它们。所有定义在 public 后面的变量或函数都可以被程序中的其他函数访问。
很重要一点:只能通过类的成员函数访问类的私有成员!

修改并完善上面的程序如下:
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;

class queue {
    int q[100];
    int sloc, rloc;

public:
       int anybody;
    void init();
    void qput(int i);
    int qget();
};
//初始化
void queue::init()
{
    rloc = sloc = 0;
}

//将一个整数放到队列中
void queue::qput(int i)
{
    if (sloc == 100) {
        cout << "Queue is full.\n";
        return ;
    }
    sloc++;
    q[sloc] = i;
}

//从队列中获得一个整数
int queue::qget()
{
    if (rloc == sloc) {
        cout << "Queue underflow.\n";
        return 0;
    }
    rloc++;
    return q[sloc];
}

int main(void)
{
    queue a, b;
    a.init();
    b.init();

    a.qput(10);
    b.qput(30);

    a.qput(20);
    b.qput(40);

    cout << a.qget() << " ";
    cout << a.qget() << "\n";

    cout << b.qget() << " ";
    cout << b.qget() << "\n";

    a.anybody = 99;
    b.anybody = 100;

    cout << "a.anybody: " << a.anybody << "\n";
    cout << "b.anybody: " << b.anybody << "\n";

    return 0;
}

运行输出:
$ ./class
20 20
40 40
a.anybody: 99
b.anybody: 100
有上程序可见,私有变量成员只能通过类的成员函数来访问;被 public 声明过的公有变量成员 anybody 可以直接在 main() 中访问。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-18 00:01 , Processed in 0.109403 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表