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的内容都是立即刷新的
  • 一个输出流可能被关联到另一个流,此时缓冲区会被刷新

除了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;
}

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

时间: 2024-10-12 14:50:21

C++ Primer笔记4_类的静态成员_IO库的相关文章

C++ Primer 笔记——嵌套类

1.嵌套类是一个独立的类,与外层类基本没什么关系.特别的是,外层类的对象和嵌套类的对象是相互独立的.在嵌套类的对象中不包含任何外层类定义的成员,在外层类的对象中也不包含任何嵌套类定义的成员. 2.嵌套类在其外层类中定义了一个类型成员.和其他成员类似,该类型的访问权限由外层类决定. class external { public: int m_id; // internal里无法使用这个变量 class internal; }; class external::internal { public:

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式、auto_ptr与单例模式、const成员函数、const 对象、mutable修饰符

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式.auto_ptr与单例模式.const成员函数.const 对象.mutable修饰符 前言 [例]写出面向对象的五个基本原则? 解答:单一职责原则,开放封闭原则,依赖倒置原则,接口隔离原则和里氏替换原则 里氏替换原则:子类型必须能够替换他们的基类型. 设计模式分为三种类型:创建型模式.结构型模式和行为型模式 一.static 与单例模式 1.单例模式 单例模式的意图:保证一个类仅有一个实例,并提供一个访问它

C++ Primer 学习笔记_17_类与数据抽象(3)_类作用域

C++ Primer 学习笔记_17_类与数据抽象(3)_类作用域 引言: 每个类都定义了自己的新作用域与唯一的类型.即使两个类具有完全相同的成员列表,它们也是不同的类型.每个类的成员不同与任何其他类(或任何其他作用域)的成员. 一.类作用域中的名字查找 1)首先,在使用该名字的块中查找名字的声明.只考虑在该项使用之前声明的名字. 2)如果在1)中找不到,则在包围的作用域中查找. 如果找不到任何声明,则出错. 类的定义实际上是在两个阶段中处理: 1)首先,编译器声明: 2)只有在所有成员出现之后

C++ Primer 学习笔记_23_类与数据抽象(9)--四种对象生存期和作用域、static 用法总结

C++ Primer 学习笔记_23_类与数据抽象(9)--四种对象生存期和作用域.static 用法总结 前言: 从上图可知,程序占用的内存被分了以下几部分. (1).栈区(stack) 存放函数的参数值,局部变量的值等,内存的分配是连续的.栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限 注意:通常栈空间容量比较小,一般是1MB-2MB,所以体积比较大的对象不适合在栈中分配. (2).堆区(heap) 由malloc系列函数或new操作符

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++ Primer 学习笔记_56_类与数据抽象 --消息处理示例

复制控制 --消息处理示例 说明: 有些类为了做一些工作需要对复制进行控制.为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message类和 Folder类分别表示电子邮件(或其他)消息和消息所出现的目录,一个给定消息可以出现在多个目录中.Message上有 save和 remove操作,用于在指定Folder中保存或删除该消息. 数据结构: 对每个Message,我们并不是在每个Folder中都存放一个副本,而是使每个Message保存一个指针集(set),set中

C++ Primer 学习笔记_57_类与数据抽象 --管理指针成员

复制控制 --管理指针成员 引言: 包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象! 将一个指针复制到另一个指针时,两个指针指向同一对象.当两个指针指向同一对象时,可能使用任一指针改变基础对象.类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在.指针成员默认具有与指针对象同样的行为. 大多数C++类采用以下三种方法之一管理指针成员: 1)指针成员采取常规指针型行为:这样的类具有指针的所有缺陷但无需特殊的复制控制! 2)类

C++ Primer 学习笔记_55_类与数据抽象 --析构函数

复制控制 --析构函数 引言: 在构造函数中分配了资源之后,需要一个对应操作自动回收或释放资源.析构函数就是这样的一个特殊函数,它可以完成所需的资源回收,作为类构造函数的补充. 1.何时调用析构函数 撤销类对象时会自动调用析构函数: Sales_item *p = new Sales_item; { Sales_item item(*p); //调用复制构造函数 delete p; //调用指针p的析构函数 } //调用对象item的析构函数 动态分配的对象只有在指向该对象的指针被删除时才撤销,

C++ Primer 学习笔记_53_类与数据抽象 --友元、static成员

类 --友元.static成员 一.友元 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类(对未被授权的函数或类,则阻止其访问):友元的声明以关键字friend开始,但是它只能出现在类定义的内部.友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响. [最佳实践] 通常,将友元声明成组的放在类定义的开始或结尾是个好主意! 1.友元关系:一个例子 假设一个窗口管理类Window_Mgr可能需要访问由其管理的Screen对象的内部