您的位置:首页 > 编程语言 > C语言/C++

C++ Primer笔记4_类的静态成员_IO库

2014-06-04 15:10 246 查看
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的内容都是立即刷新的
一个输出流可能被关联到另一个流,此时缓冲区会被刷新

除了endl,还有flush、ends两个操作符可以刷新缓冲区,如下所示:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: