C++学习笔记(1)

原著:www.geocities.jp/ky_webid/cpp


第1章 输出流

std::ios::sync_with_stdio(false) 的作用是取消缓冲区同步。

因为printf()/scanf()是C函数,而cin/cout是C++函数,这些函数需要用到各自的缓冲区,为了防止各自的缓冲区错位,C++默认将C函数和C++函数的缓冲区同步。

当你设置成std::ios::sync_with_stdio(false)后C++就会取消同步,这会提高cin/cout的运行速度,代价是不能和printf()/scanf()混用,否则会因不同步而出现问题。

第2章 输入流

#include 
#include 

int main()
{
	char str[81];
	
	std::cout << "80文字以内の文字列を入力して下さい\n";
	std::cin >> std::setw(81) >> str;
	std::cout << str;

	return 0;
}
使用 setw设置了输入长度,记得包含 iomanip

第3章 manipulate

std::flush 清空缓冲区

std::cout << "..("<< std::chrono::duration_cast(d).count()<< " ms).." << std::flush;

不使用的std ::冲洗,输出是相同的,但可能不会出现在实时.

std::endl

它不但实现了换行操作,而且还对输出缓冲区进行刷新

std::ends

Buffer中输出'\0'

std::ws

输入流中使用,表示读取时跳过空白

std::dec,std::oct,std::hex

10进制,8进制,16进制格式输出

std::cout << std::hex << num << std::endl;

std::setw,std::left,std::right,std::setfill  记得包含iomanip

设置输出宽度,补充位置设定,空白填充值

std::cout << std::setw(10) << std::left << std::setfill('0') << "123" << std::endl;

结果为0000000123


第4章 类

struct是没有方法,全部成员变量为public的类。

private,public,protect为了实现封装的特性。

构建函数顺序

//基类
class CBase
{
public:
	CBase();
	~CBase();
};

// 子类
class CSub : public CBase
{
public:
	CSub();
	~CSub();
};

调用顺序是(堆栈)

CBase构造函数

CSub构造函数

CSub析构函数

CBase析构函数


为什么没有虚构造函数?

虚构造函数,调用时会根据对象类型决定调用函数。如果用~Base()是虚函数,a.~Base()对象已经确定,可以调用对应析构函数。

而构造函数先使用基类构造函数,对象类型没有确定,无法决定使用哪个构造函数。


函数的继承

class CBase
{
public:
	CBase(int num);

private:
	int m_num;
};

class CSub : public CBase
{
public:
	CSub();
	CSub(int num);
};


// CBaseクラスのコンストラクタ
CBase::CBase(int num)
{
	m_num = num;
}

// CSubクラスのコンストラクタ
CSub::CSub() : CBase(0)
{
}

// CSubクラスのコンストラクタ
CSub::CSub(int num) : CBase(num)
{
}


new A 和 new A() 区别

类体无显示构造函数时,new A()首先调用operator new来为对象分配内存,然后使用空值初始化对象成员变量,而new A仅仅是调用operator new分配内存,对象的成员变量是无意义的随机值!

你可能感兴趣的:(C++学习笔记(1))