友元函数
在定义一个类的时候,可以把一些函数(全局函数和其他类的成员函数)声明为友元,这些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员。
将全局函数声明为友元:friend 返回值类型 函数名(参数列表);
将其他类的成员函数(不是私有成员函数)声明为友元:friend 返回值类型 其他类的类名::成员函数名(参数列表);
友元类
一个类A可以将另一个类B声明为自己的友元,类B的所有成员函数就都可以访问类A对象的私有成员。
在类定义中声明友元类:friend class 类名;
虚函数
在基类中使用关键字 virtual 声明的函数,在派生类中重新定义积累中定义的虚函数时,会告诉编译器不要静态链接到该函数。
class Shape
{
protected:
int width, height;
public:
Shape(int a = 0, int b = 0)
{
width = a;
height = b;
}
virtual int area()
{
cout << "Parent class: " << endl;
return 0;
}
};
class Rectangle: public Shape
{
public:
Rectange(int a=0, int b= 0):Shape(a, b) { }
int area()
{
cout << "Rectangle class area: " << endl;
return (width*height);
}
};
class Triangle: public Shape
{
public:
Triangle(int a=0, int b=0): Shape(a, b) { }
int area()
{
cout << "Triangle class area: " << endl;
}
};
纯虚函数
在基类中不能对虚函数给出有意义的实现,就会用到纯虚函数。
class Shape
{
protected:
int width, height;
public:
Shape(int a = 0, int b = 0)
{
width = a;
height = b;
}
virtual int area() = 0; //纯虚函数
};
*argv[]和**argv 什么区别?
文件流、字符串流
缓冲状态:无缓冲、行缓冲、全缓冲。
C++ I/O 重定向
在默认情况下,cin 只能接收从键盘输入的数据,cout 也只能将数据输出到屏幕上。通过重定向,cin 可以将指定文件作为输入源,即接收文件中早已准备好的数据,同样 cout 可以将原本要输出到屏幕上的数据转而写到指定文件中。
1. freopen()函数
该函数定义在<stdio,h>
头文件中,专门用于重定向输入流(包括scanf()
、gets()
等)和输出流(包括printf()
、puts()
等)。同时,也可以对 C++ 中的 cin
和 cout
进行重定向。
#include <iostream> //cin、cout
#include <string> //string
#include <stdio.h> //freopen
using namespace std;
int main()
{
string name, url;
//将标准输入流重定向到 in.txt 文件
freopen("in.txt", "r", stdin);
cin >> name >> url;
//将标准输出重定向到 out.txt文件
freopen("out.txt", "w", stdout);
cout << name << "\n" << url;
return 0;
}
在当前目录下创建一个 in.txt 文件,其包含的内容如下:
C++
http://c.biancheng.net/cplus/
与此同时,该目录下会自动生成一个 out.txt 文件,其包含的内容和 in.txt 文件相同:
C++
http://c.biancheng.net/cplus/
2. C++ rdbuf()函数
该函数定义在 <ios>
头文件中,专门用于实现 C++ 输入输出流的重定向。
get (1)
streambuf* rdbuf() const;
set (2)streambuf* rdbuf (streambuf* sb);
streambuf 是 C++ 标准库用于表示缓冲区的类,该类的指针对象用于代指某个具体的流缓冲区。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
//打开 in.txt 文件,等待读取
ifstream fin("in.txt");
//打开 out.txt 文件,等待写入
ofstream fout("out.txt");
streambuf *oldcin;
streambuf *oldcout;
char a[100];
//用 rdbuf() 重新定向,返回旧输入流缓冲区指针
oldcin = cin.rdbuf(fin.rdbuf());
//从input.txt文件读入
cin >> a;
//用 rdbuf() 重新定向,返回旧输出流缓冲区指针
oldcout = cout.rdbuf(fout.rdbuf());
//写入 out.txt
cout << a << endl;
//还原标准输入输出流
cin.rdbuf(oldcin); // 恢复键盘输入
cout.rdbuf(oldcout); //恢复屏幕输出
//打开的文件,最终需要手动关闭
fin.close();
fout.close();
return 0;
}