C++中static类成员

简介:

static局部变量

static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化

这种对象一旦被创建,在程序结束前不会被撤销。在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值。

#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
size_t count_calls()
{
    static size_t ctr=0;
    return ++ctr;
}

int main()
{
    for(size_t i=0; i!=10; ++i)
        cout<<count_calls()<<endl;
    getchar();
    return 0;
}

本文地址:http://www.cnblogs.com/archimedes/p/cpp-static.html,转载请注明源地址。

static类成员

全局对象会破坏封装,对象需要支持特定类抽象的实现,类可以定义类静态成员,不像普通的数据成员,static数据成员独立于该类的任意对象而存在。

1、使用类的static成员的优点:

(1)static成员的名字在类的作用域中,因此可以避免与其他类的成员或全局对象的名字冲突;

(2)可以实施封装。static成员可以是私有成员,而全局对象不是;

(3)通过阅读程序容易看出static成员是与特定类关联的。

2、定义static成员

考虑一个银行账户类,每个账户的利率总是相同的,代码如下:

class Account{
public:
    void applyint() {amount+=amount*interestRate;}
    static double rate() {return interestRate;}
    static void rate(double);
private:
    string owner;
    double amount;
    static double interestRate;
    static double initRate();
};

3、使用类的static成员

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

Account ac1;
Account *ac2=&ac1;
double rate;
rate=ac1.rate();
rate=ac2->rate();
rate=Account::rate();

像其他的成员函数一样,类成员函数可以不用作用域操作符来引用类的static成员:

class Account{
public:
    void applyint(){ amount+=amount*interestRate;}
};

static成员函数

类的成员函数定义在类的外面不需要重复static关键字

static函数没有this指针

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

static数据成员

static数据成员可以声明为任意类型,必须在类定义体的外部定义(正好一次),static数据成员不能通过类的构造函数初始化

1、特殊的整型const static成员

一般而言,类的static成员,不能在类的定义体中初始化,通常在定义时就初始化,但是一个例外是:只要初始化式是一个常量表达式,整型const static数据成员就可以在类的定义体中进行初始化:

class Account{
public:
    static double rate() {return interestRate;}
    static void rate(double);
private:
    static const int period=30;
    double daily_tbl[period];
    static double interestRate;
};

2、static成员不是类对象的组成部分

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

class Screen {
public:
    Screen clear(char=bkground);
private:
    static const char bkground='#';
};

非static成员不能用作默认的参数,因为它们的值不能独立于所属的对象而使用

目录
相关文章
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
65 2
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
118 5
|
2月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
120 4
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
160 4
|
3月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
36 4
|
3月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
34 4
|
3月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
33 1
|
3月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
3月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
3月前
|
存储 编译器 C语言
【C++类和对象(上)】—— 我与C++的不解之缘(三)
【C++类和对象(上)】—— 我与C++的不解之缘(三)