C++ 关于static variables的学习中遇到的问题总结
2014-08-05 16:57
567 查看
类的数据成员可以修饰为静态的。 一个静态成员有如下特点:
(1)静态成员不属于对象, 属于类。 利用该类创建的对象共享这个数据成员。 或者说, 静态数据成员属于类, 而非对象的。 其他的普通的数据成员不同。 我们每一次利用这个类创建对象, 都有属于创建的对象的数据私有的成员。 函数是所有的对象的共享的。 在C++ 的最新标准C++11 中, 只有const static 的变量可以在class内部初始化(class 的definition 一般位于.h 头文件中), 非const 的静态的数据变量只能够在class外部进行初始化, 一般放置在相关接口函数的implementations的.cpp
文件中。
(2)无论创建多少个对象 , 都有一份static variable。
(2)静态成员的生存期是整个程序的执行期。
静态成员一般用于维护整个类的通用值。 比如某个静态数据变量可以作为计数器, 用于记录类对象的声明的个数。
举个bank account例子:
bank.h:
所以改回来。
bank.cpp文件:
注意上面, 虽然在bank.h 中静态变量和静态函数的声明中均使用了关键字static, 但是在bank.cpp 的实现文件中, 并没有用static 关键字。
如果我们在这个bank.cpp 中使用了static 关键字, 例如:static double Bank::bankBalance = 0; 出现错误如下:
所以改回来。
主程序main.cpp 文件如下:
运行结果如下:
下面说说静态成员函数。
静态成员函数有如下特点:
(1)静态成员函数只能访问类中声明的其他静态成员(即静态成员函数和静态成员变量)。
(2)调用静态成员函数的时候, 使用的是类名(虽然也可以使用对象点运算的形式, 因为是该类所有的对象共享的, 所以当然也可以使用对象。 只不过用类名界符号定更加常见)
(1)静态成员不属于对象, 属于类。 利用该类创建的对象共享这个数据成员。 或者说, 静态数据成员属于类, 而非对象的。 其他的普通的数据成员不同。 我们每一次利用这个类创建对象, 都有属于创建的对象的数据私有的成员。 函数是所有的对象的共享的。 在C++ 的最新标准C++11 中, 只有const static 的变量可以在class内部初始化(class 的definition 一般位于.h 头文件中), 非const 的静态的数据变量只能够在class外部进行初始化, 一般放置在相关接口函数的implementations的.cpp
文件中。
(2)无论创建多少个对象 , 都有一份static variable。
(2)静态成员的生存期是整个程序的执行期。
静态成员一般用于维护整个类的通用值。 比如某个静态数据变量可以作为计数器, 用于记录类对象的声明的个数。
举个bank account例子:
bank.h:
#ifndef BANK_H #define BANK_H #include <iostream> #include <string> using namespace std; class Bank { public: //default constructor Bank(); //overload constructor Bank(string, int, double); //destructor ~Bank(); //accessor function string getName() const; int getAccountNumber() const; double getBalance() const; //mutator functions void setName(string); void setAccountNumber(int); void setBalance(double); void deposit(double); void withdraw(double); static void printBankInfo(); private: //member variables string name; int accountNumber; double balance; static int totalAccount ;// must initialize in the implementation file, ie outside the class definition static double bankBalance; }; #endif如果上图中, 在class内部中对static variable初始化,l例如: static int totalAccount = 0 ; 会出现如下报错。
所以改回来。
bank.cpp文件:
#include "Bank.h" // static member variables double Bank::bankBalance = 0; int Bank::totalAccount = 10000; Bank::Bank() { accountNumber = 0; balance = 0.0; totalAccount++; } Bank::Bank(string newName, int newAccount, double newBalance) { string name = newName; accountNumber = newAccount; balance = newBalance; totalAccount++; bankBalance += newBalance; } Bank::~Bank() { totalAccount--; bankBalance -= balance; } string Bank::getName() const { return name; } int Bank::getAccountNumber() const { return accountNumber; } double Bank::getBalance() const { return balance; } //mutator functions void Bank::setName(string newName) { name = newName; } void Bank::setAccountNumber(int newAccountNumber) { accountNumber = newAccountNumber; } void Bank::setBalance(double newBalance) { bankBalance -= balance; balance = newBalance; bankBalance += balance; } void Bank::deposit(double amount) { balance += amount; bankBalance += amount; } void Bank::withdraw(double amount) { balance -= amount; bankBalance += amount; } void Bank::printBankInfo() { cout << endl << "Number of accounts: " << totalAccount << endl; cout << "total balance: " << bankBalance << endl; }
注意上面, 虽然在bank.h 中静态变量和静态函数的声明中均使用了关键字static, 但是在bank.cpp 的实现文件中, 并没有用static 关键字。
如果我们在这个bank.cpp 中使用了static 关键字, 例如:static double Bank::bankBalance = 0; 出现错误如下:
所以改回来。
主程序main.cpp 文件如下:
#include <iostream> #include <string> #include "Bank.h" using namespace std; int main() { Bank::printBankInfo(); cout << "Adam create an account and deposit 500"; Bank Adam("Adam", 0001, 500); Bank Sarah; cout << endl << "Sarah create an account and deposit 1000"; Sarah.setName("Sarah"); Sarah.setAccountNumber(0002); Sarah.setBalance(1000); Bank::printBankInfo(); cout << "Dick creates an account and deposits 1500"; Bank Dick("Dick", 0003, 1500); Bank::printBankInfo(); cout << endl << "Dick set his balance to 1200"; Dick.setBalance(1200); Bank::printBankInfo(); cout << endl << "Sarah deposited 700"; Sarah.deposit(700); Bank::printBankInfo(); cout << "Adam's account was terminated due to lack of use."; Adam.~Bank(); Bank::printBankInfo(); return 0; }
运行结果如下:
下面说说静态成员函数。
静态成员函数有如下特点:
(1)静态成员函数只能访问类中声明的其他静态成员(即静态成员函数和静态成员变量)。
(2)调用静态成员函数的时候, 使用的是类名(虽然也可以使用对象点运算的形式, 因为是该类所有的对象共享的, 所以当然也可以使用对象。 只不过用类名界符号定更加常见)
相关文章推荐
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- C++学习中关于cout遇到的一个小问题
- c++关于结尾遇到‘\n’或其他特殊字符结束读取的问题(个人总结,大神勿喷)
- 学习中遇到的问题--关于内存分配异常的问题
- C++之父元旦专访(8+13个问题,关于C++的学习&使用和未来)
- 今天又学习了,关于windows和Linux双系统删除Linux遇到的问题。
- 关于c#调用c++的dll遇到的问题
- C++学习中遇到的问题及其解决方案
- 关于C++深入学习的问题
- 关于在neoshine linux下使用电视卡遇到的问题和总结
- 【C++学习】关于unsigned long long的输出问题
- 学习C++遇到的问题
- WTL学习过程中遇到的一些问题总结
- C++学习中遇到的问题及其解决方案
- C++学习中遇到的两个问题
- 学习中遇到的问题-关于set_new_handler()
- JAVA与C++::关于JNI中文字符串操作问题总结
- C++之父元旦专访(8+13个问题,关于C++的学习&使用和未来)(转帖)
- C++学习的时候遇到的问题
- 在自己学习stuts是遇到问题后总结的经验。