学习C++ Primer Plus本书,有感觉比较重要的点进行相关记录

第三章

cout控制符dex hex oc 分别指示cout以十进制 十六进制 八进制方式显示整数 (默认以dex显示)

修改格式后,之后所有的cout所输出的数字均为所修改的格式。

用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// hexoct2.cpp -- display values in hex and octal
#include <iostream>
using namespace std;
int main()
{
using namespace std;
int chest = 42;
int waist = 42;
int inseam = 42;

cout << "Monsieur cuts a striking figure!" << endl;
cout << "chest = " << chest << " (decimal for 42)" << endl;
cout << hex; // manipulator for changing number base
cout << "waist = " << waist << " (hexadecimal for 42)" << endl;
cout << oct; // manipulator for changing number base
cout << "inseam = " << inseam << " (octal for 42)" << endl;
// cin.get();
return 0;
}

第四章

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <stdio.h> //getchar()

using namespace std;

int main()
{
int n;
char test[100];
cin >> n;
getchar(); //1#
cin.getline(test, 11); //2#
//cin >> test; //3#
cout << test << endl;
return 0;
}

将1#注释掉,运行程序,输入n的值之后,程序就马上结束

‘\n’是cin.getline()的结束符

在cin执行的时候,它是会忽略一开始输入的所有换行符’\n’和空格的。所以它并不会将残留的’\n’当做它的结束符
而cin.getline()是不会忽略的

==在cin与cin.getline()或者cin.get()混合使用时,要注意’\n’带来的影响!==


string所创建的字符串ch可以使用

1
getline(cin, ch);

输入


共用体 为了节省内存而创建 cpppp p94


不能将 整形赋给指针 ,需要强制类型转换:

1
2
int * pt;
pt = (int *) 0xB8000000;

gets(char*) 参数为char*, 不接受string类型的参数。


数组的代替品

1.vecyor

1
2
3
4
5
6
7
#include <vector>
...
using namespace std;
vector<int> vi;
int n;
cin >> n;
vector<double> vd(n);

vecyor 是一个动态数组

2.array

1
2
3
4
5
#include <array>
...
using namespace std;
array<int, 5> ai;
array<double, 4> ad = {1.2, 2.1, 3.43, 4.3};

array 是一个长度固定的数组


获取 array,vector,string 的元素个数
array:

1
sizeof(array) / sizeof(array[0])

vector:

1
vector.size()

string:

1
string.size()

第五章

1
cout.setf(ios_base::boolalpha);

cout 在显示bool值之前将它们转化为int,但上述函数调用设置了一个标记,该标记命令cout显示true和false,而不是1和0.


for语句初始化部分可以声明一个变量,但离开for语句后这个变量将消失不可用。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// waiting.cpp -- using clock() in a time-delay loop
#include <iostream>
#include <ctime> // describes clock() function, clock_t type
int main()
{
using namespace std;
cout << "Enter the delay time, in seconds: ";
float secs;
cin >> secs;
clock_t delay = secs * CLOCKS_PER_SEC; // convert to clock ticks
cout << "starting\a\n";
clock_t start = clock();
while (clock() - start < delay ) // wait until time elapses
; // note the semicolon
cout << "done \a\n";
// cin.get();
// cin.get();
return 0;
}

使用clock()和头文件ctime创建的延迟循环代码 P149


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// textin2.cpp -- using cin.get(char)
#include <iostream>
int main()
{
using namespace std;
char ch;
int count = 0;

cout << "Enter characters; enter # to quit:\n";
cin.get(ch); // use the cin.get(ch) function
while (ch != '#')
{
cout << ch;
++count;
cin.get(ch); // use it again
}
cout << endl << count << " characters read\n";
// get rid of rest of line
// while (cin.get() != '\n')
// ;
//cin.get();
return 0;
}

合理利用缓冲区的例子 P153


第六章

字符函数库cctype P179


1
2
3
cout<<fixed  //用一般的方式输出浮点型,例如C++程序在控制台显示的时候大一点的数,显示的时候使用了科学计数法,使用该命令即可像一般的方式显示
cout.precision(2//设置精确度为2,并返回上一次的设置。
cout.setf(iOS_base::showpoint) //显示浮点数小数点后面的零。

http://blog.csdn.net/FX677588/article/details/52717245

关于字符串string、char*字符串数组与其他类型转换

string<——>char*

1
2
3
4
5
6
7
//char*转为string
char * nzArr = "abcd";
string str = nzArr;

//string转为char*
string str = "abcd";
char* nzArr = const_cast<char*>(str.c_str());

string可以像数组arr[5]一样这样指定某个char string[5]


第七章

函数指针

  1. 函数名即为函数地址
  2. 使用函数指针需要先进行声明
  3. 函数指针中调用函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// fun_ptr.cpp -- pointers to functions
#include <iostream>
double betsy(int);
double pam(int);

// second argument is pointer to a type double function that
// takes a type int argument
void estimate(int, double (*pf)(int));
//先声明带有函数指针参数的函数或者直接声明函数指针

int main()
{
using namespace std;
int code;

cout << "How many lines of code do you need? ";
cin >> code;
cout << "Here's Betsy's estimate:\n";
estimate(code, betsy);
cout << "Here's Pam's estimate:\n";
estimate(code, pam);
// cin.get();
// cin.get();
return 0;
}

double betsy(int lns)
{
return 0.05 * lns;
}

double pam(int lns)
{
return 0.03 * lns + 0.0004 * lns * lns;
}

void estimate(int lines, double (*pf)(int))
{
using namespace std;
cout << lines << " lines will take ";
cout << (*pf)(lines) << " hour(s)\n";
}

第八章

函数模板
声明和定义时均需要

1
template <typename T> // or <class T>

第十一章

1
2
3
4
Time A, B, C, D;
D = A + B + C;
//等同于以下语句
D = A.operator+(B.operator+(C));

第十二章

析构函数将在定义对象的代码块执行完毕时调用

c++ 文件操作

要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件


1
void open(const char *filename, ios::openmode mode);

open() 成员函数的第一参数指定要打开的文件的名称和位置,第二个参数
定义文件被打开的模式。

模式标志 描述
ios::app 追加模式。所有写入都追加到文件末尾。
ios::ate 文件打开后定位到文件末尾。
ios::in 打开文件用于读取。
ios::out 打开文件用于写入。
ios::trunc 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。

例如,如果您想要以写入模式打开
文件,并希望截断文件,以防文件已存在,那么您可以使用下面的语法:

1
2
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

关闭文件的close()成员:

1
void close();

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
char data[100];

// 以写模式打开文件
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);

// 向文件写入用户输入的数据
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();

// 再次向文件写入用户输入的数据
outfile << data << endl;
// 关闭打开的文件
outfile.close();

// 以读模式打开文件
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;

// 在屏幕上写入数据
cout << data << endl;
// 再次从文件读取数据,并显示它
infile >> data;
cout << data << endl;
// 关闭打开的文件
infile.close();
return 0;
}
1
2
3
4
5
6
7
8
// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg( n );
// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg( n, ios::cur );
// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg( n, ios::end );
// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );