C++ Primer笔记4_静态成员类_IO库
1.静态成员类
static成员变量与函数
static成员变量:必须在类外初始化。(const或引用类型变量必须在构造函数初始化列表里初始化)
static成员函数:
不依赖于类。相当于类里的全局函数(能够由该类对象调用,也能够 类名::函数名()的形式调用)
不包括this指针。不能声明为const,声明为const表示不会改变对象。而static成员函数存在于不论什么对象之外。
相当于把訪问范围限制在所在的类中! 注意:不能訪问类中非static成员变量以及非static成员函数。
注意:尽管静态成员不属于类的某个对象。但我们仍然能够使用类的对象、引用、指针来訪问静态成员。
样例:
#include <iostream>
using namespace std; class A
{
public:
A(int a):age(a){cout << n << endl;}
void print()const
{
cout << "age: " << age << endl;
//printN(); Right!
}
static void printN()
{
cout << "n: " << n << endl;
//cout << "age: " << age << endl; Error!
}
private:
int age;
static int n;
}; int A::n = 20; int main()
{
A a(10);
a.print();
a.printN();
A::printN();
return 0;
}
2.IO库
头文件 类型
iostream istream wistream从流中读取数据
ostream wostream向流中写入数据
iostream wiostream读写流
fstream ifstream wifstream从文件里读取数据
ofstream wofstream向文件里写入数据
fstream wfstream读写文件
sstream istringstream wistringstream 从string读取数据
ostringstream wostringstream向string写入数据
stringstream wstringstream 读写string
详细见例如以下关系图
缓冲区:
每一个输出流都管理一个缓冲区,用来保存读写的数据。导致缓冲区的刷新原因:
- 程序正常结束,作为main函数的return操作的一部分,缓冲被刷新
- 缓冲区满,刷新缓冲区
- 操作符endl能够用来显示的刷新缓冲区
- 默认情况下,写到ceer的内容都是马上刷新的
- 一个输出流可能被关联到还有一个流。此时缓冲区会被刷新
cout << "scott" << endl;//输出scott和一个换行符。然后刷新缓冲区
cout << "scott" << flush;//输出scott 然后刷新缓冲区
cout << "scott" << ends;//输出scott和一个空字符 然后刷新缓冲区
注意:假设程序异常终止。输出缓冲区是不会被刷新的!
创建流对象时。我们能够提供文件名称,假设提供了文件名称。则open函数会被自己主动调用。
ifstream in(s);//构造一个ifstream并打开文件
ofstream out;//并未关联不论什么文件
当fstream对象被销毁时,close会自己主动调用。
#include <iostream>
#include <fstream>
#include <string>
using namespace std; int main()
{
string s1("in");
string s2("out");
string s3; ifstream in(s1);
ofstream out(s2); while(getline(in, s3))
{
out << s3 << endl;
} return 0;
}
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector> using namespace std; int main()
{
string szFileName("in");
vector<string> vecStr;
string line; ifstream in(szFileName.c_str());
while(getline(in, line))
{
cout << line << endl;
vecStr.push_back(line);
}
cout << "=================" << endl;
for(vector<string>::iterator i = vecStr.begin(); i!=vecStr.end(); ++i)
{
cout << *i << endl;
} return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
最新文章
- 模拟ajax的 script请求
- Java EE开发平台随手记1
- JavaScript之旅(三)
- Eclipse: The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
- 一个xib钟多个Cell
- zw版【转发&#183;台湾nvp系列Delphi例程】HALCON FillUp2
- UIButton的状态
- 【ZZ】Python入门神图
- HTML5 Security Cheatsheet使用说明
- ionic2 自定义cordova插件开发以及使用 (Android)
- 【C++小白成长撸】--矩阵乘法程序
- 第03周-Java作业评价
- hdu_3068 最长回文(Manacher算法)
- 测序数据质控-FastQC
- netty(八) netty中自带channelhandler
- opencv学习之路(4)、Mat类介绍,基本绘图函数
- python笔记之循环控制
- crop和resize操作区别
- 团队项目-NABCD
- ubuntu vim 配置
热门文章
- LeetCode: Valid Palindrome [125]
- 用EnableMenuItem不能使菜单变灰的原因
- Javascript语言精粹之正则表达式知识整理
- mysql安装注意
- Big Event in HDU(杭电1171)(多重背包)和(母函数)两种解法
- android中的返回键与Activity
- [转]C#自定义开关按钮控件--附带第一个私活项目截图
- kb3035583
- 【原创】leetCodeOj --- Word Ladder II 解题报告 (迄今为止最痛苦的一道题)
- C++ 习题 输出日期时间--友元类