cplusplusprimer_note1

c语言

Dennis Ritchie, Unix

改变“意大利面条式”,引入结构化编程

自顶向下的设计

c99 ANSI C , K&R C

oop

自下向上的设计

c++ bjarne Stroustrup

c++98/03

c++11

保留程序执行窗口的技巧

cin.get();

cin.get();

return 0;

尽可能在首次使用变量前才声明它

头文件climits: INT_MAX CHAR_BIT

sizeof(type_name) 字节数

#define c风格的创建符号常量的方法,c++建议用const

c++初始化:

int w(432);
int c = {32};
int c{32};
int c{}; //set c to zero

输出控制符:

cout << endl;
cout << hex;//改变之前一直有效
cout << oct;
cout << dec;

后缀:ULL

cout.put('a'); //打印字符

char ch;
cin >> ch;
//输入5,ch变成'5'

int n;
cin >> n;
//输入5,ch变成5

//c++早期,把字符常量存为int形式
char ch = 'M'//截取八位到ch中
cout << '$';//打印ascii码
cout.put('$');//打印字符

wchar_t L'a'

char16_t u'a'

char32_t U'a'

bool ans = -100;//隐式转换

const :c++, ANSI C

cout.setf(ios_base::fixed)

浮点数常量默认类型double

1.2f/F float

1.2l/L long double

123L long

123U unsigned

{}列表初始化,不允许缩窄

整型提升 integral promotion bool等在计算时会转换成int类型再计算

强制类型转换:

(int) a; //c style
int (a); //c++ style 像函数调用

static_cast<typeName> (value) // 更严格

and or not 是c++保留字不能做变量名 不是关键字 c也可以将其用作运算符,只要包含头文件iso646.h

字符处理软件包,继承自c:cctype

switch:char int enum类型

int n;
cin >> n;

当用户输入非数字时:

  • n值不变
  • 不匹配的输入留在输入队列中
  • cin中一个错误标记被设置
  • cin方法调用返回false

cin.get(ch) vs cin.get()

属性 cin.get(ch) cin.get()
传入字符方式 赋值给ch 函数返回
字符输入时返回值 istream对象(bool转换后为true) int类型
EOF时返回值 istream对象(bool转换后为false) EOF(-1)
...
while (!(cin >> golf[i])) {
    cin.clear(); //reset input
    while (cin.get() != '\n') //get rid of bad input
        continue;
    cout << "enter another number";
}
...

文件输入输出:fstream头文件

iosteam提供了预定义的cout的ostream对象,但是必须自己声明oftream对象

ofstream outFile;
ofstream fout;
fout.open("a.txt");
char filename[50];
cin >> filename;
fout.open(filename);

fout << "xxx" << endl;

fout.close();

ifstream fin;
fin.open("a.txt");
fin.open(filename);

double wt;
char line[81];
fin >> wt;
fin.getline(line, 81);

fin.is_open();
fin.eof();
fin.fail();

argument实际参数 parameter形式参数

int sum_arr(int arr[], int size);
int sum_arr(int * arr, int size);
//这要求我们必须显示传递数组长度

arr[i] == *(arr + i);
&arr[i] == arr + i;

void show_array(const double arr[], int n);
void show_array(const double * arr, int n);
//不是说原始数组是常量,只是不能在show_array函数中使用arr更改数组

只有当只存在一层间接关系时才能将非const指针赋值给const指针

//一层:
int age = 39;
int * pd = &age;
const int * pt = pd;//可以

//二层
const int **pp2;
int * p1;
const int n = 13;
pp2 = &p1;  //假设成立
*pp2 = &n;
*p1 = 10;   //修改了n的值!

尽可能使用const:

  • 避免无意间修改
  • 使用const的函数能处理const和非const实参,否则只能处理非const实参
int g = 1;
int c = 2;
const int * p = &g;

*p = 20; // 错误
p = &c;

int * const p2 = &g;
*p2 = 20;
p2 = &c; //错误

//没用const,因为只能用于指向基本类型的指针
 int  n = 11;
 int* p = &n;

const int** pp = &p;//错误!
//const int** pp2 = (const int **) 0x000000B3B10FF6D4;
const int n = 1;

*pp2 = &n; //
int sum(int arr[][4], int size);
int sum(int (*arr)[4], int size);
//必须指定行数,可以不指定列数
//arr[2]是一个由4个int组成的数组名称

arr[r][c] == *(*(arr + r) + c);
//没用const,因为只能用于指向基本类型的指针

c风格字符串:

  • char数组
  • 字符串常量""
  • 代表字符串地址的char指针
char ch[10] = "abc";
char * str = "aaa";
int n1 = strlen(ch);
int n2 = strlen(str);
int n3 = strlen("abc");

三种类型都是char指针

结构可以正常像基本类型操作,但是如果结构体很大,普通的函数返回会赋值一份降低效率,c处理的方式是传递结构地址,c++则可以按引用传递

()

发表评论