`
clskkk2222
  • 浏览: 34899 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
  • NeuronR: 引用因为用于向函数传递对象和从函数返回对象,该构造函数一般不应 ...
    复制构造函数

友元 static 类成员

    博客分类:
  • C++
阅读更多

友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类

 

友元的声明以关键字 friend 开始,它只能出现在类定义的内部

 

友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响


通常,将友元声明成组地放在类定义的开始或结尾是个好主意

 

友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类

 

将一个类设为友元,友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员

 

一般地讲,必须先定义包含成员函数的类,才能将成员函数设为友元;另一方面,不必预先声明类和非成员函数来将它们设为友元

 

友元声明将已命名的类或非成员函数引入到外围作用域中,此外,友元函数可以在类的内部定义,该函数的作用域扩展到包围该类定义的作用域


用友元引入的类名和函数(定义或声明),可以像预先声明的一样使用

 

类必须将重载函数集中每一个希望设为友元的函数都声明为友元


static 类成员

 

static 数据成员独立于该类的任意对象而存在;每个 static 数据成员是与类关联的对象,并不与该类的对象相关联

 

static 成员函数没有 this 形参,它可以直接访问所属类的 static 成员,但不能直接使用非 static 成员


使用类的 static 成员的优点
1. static 成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突
2. 可以实施封装。static 成员可以是私有成员,而全局对象不可以
3. 通过阅读程序容易看出 static 成员是与特定类关联的,可清晰地显示程序员的意图

在成员声明前加上关键字 static 将成员设为 static,static 成员遵循正常的公有/私有访问规则

 

可以通过作用域操作符从类直接调用 static 成员,或者通过对象、引用或指向该类类型对象的指针间接调用类的 static 成员

 

类成员函数可以不用作用域操作符来引用类的 static 成员

 

在类的外部定义 static 成员时,无须重复指定 static 保留字,该保留字只出现在类定义体内部的声明处

 

static 成员函数不能被声明为 const

 

static 成员函数也不能被声明为虚函数

 

static 数据成员必须在类定义体的外部定义(正好一次)

 

不像普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化

 

保证对象正好定义一次的最好办法,就是将 static 数据成员的定义放在包含类非内联成员函数定义的文件中

 

像使用任意的类成员一样,在类定义体外部引用类的 static 成员时,必须指定成员是在哪个类中定义的,然而,static 关键字只能用于类定义体内部的声明中,定义不能标示为 static

 

只要初始化式是一个常量表达式,整型 const static 数据成员就可以在类的定义体中进行初始化

 

const static 数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义,在类内部提供初始化式时,成员的定义不必再指定初始值


static 成员不是类对象的组成部分,独立于任何对象而存在

 

static 数据成员的类型可以是该成员所属的类类型,非 static 成员被限定声明为其自身类对象的指针或引用

 

static 数据成员可用作默认实参


非 static 数据成员不能用作默认实参,因为它的值不能独立于所属的对象而使用
ISO C++ forbids in-class initialization of non-const static member 'somemember'

 

#include <iostream>
#include <string>
using namespace std;

class X {
    friend class Y;
    friend void f() { /* ok to define friend function in the class body */ }
};
class Z {
    Y *ymem; // ok: declaration for class Y introduced by friend in X
    void g() { return ::f(); } // ok: declaration of f introduced by X
};

class Y {
      //todo...      
};

class Account {
public:
    // interface functions here
    void applyint() { amount += amount * interestRate; }
    static double rate() { return interestRate; }
    static void rate(double); //set interestRate
private:
    string owner;
    double amount;
    static const int period = 30; //ok!! period is const static data member of integral type 
    static double interestRate;
    static double initRate();
};
double Account::initRate()
{
     return 0.05;     
}
void Account::rate(double newRate)
{ 
     interestRate = newRate;
}
// define and initialize static class member
//interestRate is in the scope of the class 
//and hence has access to the private member initRate() of the class 
double Account::interestRate = initRate();

// definition of static member with no initializer;
// the initial value is specified inside the class definition
const int Account::period;

class Bar {
public:
 // ...
private:
     static Bar mem1; // ok
     Bar *mem2;       // ok
     // Bar mem3;       error
};

class Screen {
public:
    // bkground refers to the static member
    // declared later in the class definition
    Screen& clear(char = bkground);
private:
    static const char bkground = '#';
};

     
int main()
{  
    
    Account ac1;
    Account *ac2 = &ac1;
    // equivalent ways to call the static member rate function
    double rate;
    rate = ac1.rate();        // through an Account object or reference
    cout << "ac1.rate() --> " << rate << endl;
    rate = ac2->rate();       // through a pointer to an Account object
    cout << "ac2->rate() --> " << rate << endl;
    rate = Account::rate();   // directly from the class using the scope operator
    cout << "Account::rate() --> " << rate << endl;
     
    return 0;
}

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    友元类成员课件.doc

    友元函数或友元类可以访问另一个类的私有或受保护的成员,这种关系是非成员函数或非友元类所不具备的。虽然友元可以提供更高的灵活性,但它也带来了一些问题,比如降低了封装性,增加了代码的复杂性和维护难度。友元...

    C++ friend友元函数和友元类 (2).pdf

    - 友元函数不是类的成员,所以它们不能访问`static`私有成员。 在实际开发中,虽然`friend`功能强大,但由于其潜在的风险,通常鼓励开发者尽可能避免使用,除非确实无法通过其他方式实现所需功能。在上述示例中,`...

    C++友元接口讲解让你更加的了解友元

    在C++编程语言中,友元(Friend)是一个非常重要的概念,它允许非成员函数或类访问另一个类的私有(private)和受保护(protected)成员。本文将深入探讨C++中的友元机制,并通过具体的代码示例来展示如何有效地使用...

    C++类中的各种成员,嵌套类,友元,this指针专题(pdf)

    本文将详细介绍C++类中的各种成员,包括类中的静态成员变量、成员函数、常量成员变量、常量成员函数、常量静态数据成员、对象成员、类成员指针、嵌套类、友元、this指针以及.*和-&gt;*运算符。 #### 二、类中的静态...

    C++静态成员和友元, 喜欢的可以下

    C++静态成员和友元 C++中的静态成员和友元是两个重要的概念,它们在编程中扮演着重要的角色。 一、静态成员 静态成员是指所有类对象公有的成员变量...静态成员可以被所有类对象共享,而友元可以访问类的非公开成员。

    实验4 含有类的静态成员与类的友元的C++程序设计.pdf

    在C++编程中,类的静态成员和友元是两种重要的特性,它们分别用来处理类的共享数据和访问控制的问题。本实验旨在帮助学生深入理解这两种特性及其在实际编程中的应用。 首先,类的静态成员主要用来处理类的共享状态...

    C++程序设计课件:第15章 静态成员与友元.ppt

    在某些情况下,类的某些成员需要访问其他类的私有成员,而这些私有成员不可以被外部访问,这时需要使用友元。 十五点六 友员的使用 友元是类的朋友,可以访问类的私有成员。友元可以是函数,也可以是类。友元的...

    C 程序设计课件:第15章 静态成员与友元.ppt

    C++ 程序设计静态成员与友元 本资源摘要信息将详细介绍 C++ 程序设计中的静态成员和友元,包括静态成员...在上面的例子中,`printStudentInfo` 函数是 `Student` 类的友元,它可以访问 `Student` 类的私有成员 `age`。

    实验三 静态成员和友元.zip

    友元则是一种打破封装机制的机制,它允许一个类访问另一个类的私有或保护成员。这在某些情况下是必要的,例如实现复杂的关联结构或者提供特定的访问权限。声明友元的方式如下: ```cpp class FriendClass; class ...

    C++实验报告四--静态成员与友元.pdf

    在类Stack中,数据成员`num`被声明为静态成员(`static int num;`),用于记录链表中的节点数量,即栈中的元素个数。这意味着,无论创建了多少个Stack类的实例,`num`的值始终是所有实例共享的。 友元函数和友元类...

    C++实验报告四--静态成员与友元.docx

    友元函数或友元类可以访问另一个类的私有和保护成员,即使这些成员在通常情况下是不可见的。在本实验中,虽然没有直接展示友元的使用,但可以设想,为了实现某些功能,可能需要一个友元函数来访问并操作`Stack`类的...

    面向对象的程序设计面向对象的程序设计.doc

    选项B和C的`static`关键字放置位置错误,选项D将友元函数定义为类B的成员函数,这并不是友元函数的定义方式。 5. 定义类B为类A的友元类的正确语句是`class A{ friend class B; };`,选项C正确。选项A缺少`class`...

    C++语言程序设计教程:第3章 类与对象.ppt

    本章主要介绍了C++语言中类与对象的概念,包括类的定义、实现、构造函数、析构函数、拷贝构造函数、友元函数和友元类、const成员和const对象、static成员、this关键字、对象数组、类组合关系等。 类的定义是声明一...

    C程序设计面向对象的妥协PPT课件.pptx

    **友元类** 是一个类可以声明另一个类为其友元,使得友元类的所有成员函数都可以访问原类的私有和受保护成员。例如,在【例6-2】中,`Date`类被声明为`Clock`类的友元,这意味着`Clock`类中的`display`成员函数可以...

    详解C++-二阶构造模式、友元

    通过 A 类的友元(B 类)来访问成员变量: ```c class A { int i; friend class B; // 声明 B 是 A 的友元 }; class B { public: void accessA(A& a) { a.i = 10; // 访问 A 的私有成员变量 } }; ``` C++ 二阶...

    C++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...

    推荐清华大学出品 面向对象程序设计 C++语言 C++程序设计教程 第4章 类和对象(二) 共84页.ppt

    友元成员是类的一个成员函数,它被声明为其他类的友元,从而可以在该成员函数内部访问其他类的私有和保护成员。友元类则允许其所有的成员函数成为另一个类的友元,可以自由访问友元类的私有和保护成员。 常对象是指...

Global site tag (gtag.js) - Google Analytics