一、第一个C++程序
#include <iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl;
}
1、文件扩展名
C++源代码的文件扩展名.cpp、C、cxx、c(需要指定编译语言)
自定义的头文件依然保留.h
2、头文件
C++标准库的头文件不带.h,最常用的是iostream
C语言中的头文件依然可以继续使用,stdio.h或cstdio
3、输入输出
cout<<输出
cin>>输入
endl换行
cout和cin不再使用占位符,它可以自动识别数据类型。
scanf和printf可以继续使用。但需要添加头文件
4、编译器
gcc也可以编译C++的源码,但需要添加额外的参数(-x c++)
g++是编译C++源码的最简单的编译器,一般操作没有默认安装。
ubuntu系统的安装指令:sudo apt-get install g++
之前的gcc的编译参数,依然可以继续使用。
注意:C++编译时的错误提示不是很精准,一个错误可能会产生大量的错误提示。
5、引入了名字空间概念
using namespace std;//std 名字空间内包含cout、cin、endl等
二、C++中的基本数据类型
1、C++完全兼容C语言中的所有数据类型(C++几乎兼容C语言的所有语法。)。
2、添加了bool类型、字节宽度1,数值true(非零值),false(零值)。
3、在显示bool变量前,使用boolalpha可以以true或flase的形式显示bool值。
4、void* 与其它类型指针的转换受到限制
void* 不可以直接给其它类型的指针赋值,必须经过强制转换。
任意类型的指针都可以直接给void*赋值。
三、C++中的联合、枚举、结构
1、在C++中联合(union)、枚举(enum)、结构(struct)设计成功后,再使用不需要加关键字。
2、枚举的检查更为严格(C++中的枚举是一种独立的数据类型)。
3、结构成员中可以有函数,在函数中可以直接访问结构的成员。
4、结构对象可以继续使用.或->访问成员、成员函数。
5、结构中的成员添加了访问属性:
public:开放的,被它修饰过的成员在任何位置都可以访问
private:私有的,被它修饰过的成员只能在成员函数中使用
protected:以后再说。
6、结构在创建时会自动调用一个函数-构造函数(可以有多个,函数重载)。
a、无返回值
b、名字与结构相同
c、参数可以任意
7、结构在释放时会自动调用一个函数-析构函数。
a、无返回值、参数
b、~结构名
总结:
- 函数重载:在一个结构内,C++允许函数同名,但参数需要可区分化,即同名函数在编译时,编译器可以通过参数数量或类型区分同名函数,以实现不同功能。(实际上在编译结束后,同名函数在可执行文件中并不同名,可通过nm a.out 查看)
-
#include <iostream> using namespace std; void func(int num) { cout << num << endl; } void func(float num) { cout << num << endl; } void func(int num1,int num2) { cout << num1 << num2 << endl; } void func(int num1,float num2) { cout << num1 << num2 << endl; } int main() { int a = 50; float b = 3.14; int c = 40; func(a); func(b); func(a,c); func(a,b); }
查看同名函数编译后,在可执行文件中的名字
>nm /a.out ... 0804864f T _Z4funcf 08048624 T _Z4funci 080486b4 T _Z4funcif 0804867a T _Z4funcii ...
- 函数设置默认值:在对函数进行定义时,只需对函数参数初始化即可,初始化的值,即为默认值。重要的一点,当只有部分参数需要设置默认值时,则被设置默认值的参数应置于参数列表的右边,没有设默认值的参数应置于左边,避免函数传参出现歧义。
-
#include <iostream> using namespace std; void func(int num1,int num2 = 10) { cout << num1 << num2 << endl; } int main() { func(10); func(20,40); }
- 变量的引用(&):引用即为映射,也可理解为取别名,映射的全部成员共享一个变量,一变全变。重点,引用者在定义时就需要被初始化,而且被引用者也应有确切的值。并且,引用者一旦引用一次,就不会再次引用,相当引用操作前面添加了const。其次,被引用者还可以是常量,但必须使用const修饰。(引用在函数传参具有指针的效果)
-
#include <iostream> using namespace std; int main() { int name = 100; const int & big = 40; cout << big << endl; //const int & bigman = name; int & bigman = name; cout << bigman << endl; }
练习:定义一个函数,计算两个整数的最大公约数和最小公倍数,最大公约数用返回值返回,最小公倍数用引用返回。
-
#include <iostream> using namespace std; void swap(int& a,int& b) { int c = a; a = b; b = c; } int func(int a,int b,int& c) { int d = 0; // for(c = a < b ? a : b;c >= 1;c--) { if(0 == a%c && 0 == b%c) break; } // for(d = a > b ? a : b;d <= a * b;d++) { if(0 == d%a && 0 == d%b) break; } return d; } int main() { int num1 = 12; int num2 = 18; swap(num1,num2); cout << num1 << " " << num2 << endl; int div = 0; int mul = 0; div = func(num1,num2,mul); cout << div << " " << mul << endl; }
- 变量内存申请与释放:new、delete 运算符可以自动调用类的构造函数和析构函数,并且new返回的是有类型指针不同于malloc(void*)。注意,使用new对变量的初始化、数组的初始化、结构的初始化等操作的格式,以及数组内存释放的delete的格式。
-
int* nump = new int(100);//变量 int* strp = new int[10]{0,1,2,3,4,5,6,7,8,9};//数组 Date* date = new Date(a,b);//类,需要传参 delete nump; delete date; delete[] strp;
- 数据结构:结构、枚举、联合(相关格式及用法)
-
union Data { int num; char ch[6]; }; enum Key { key_up = 183, key_down = 184, key_right = 185, key_left = 186 }; struct Student { char name[20]; char sex; int age; void show_stu(void) { cout << name << " " << sex << " " << age << endl; } }; int main() { //联合 Data d; cout << sizeof(d) << endl; //枚举 Key k = key_up; cout << k << endl; //结构 Student t = {"heheh",'m',20}; t.show_stu(); }
练习:使用结构Maze封装走迷宫游戏:自行设置15*15大小的迷宫的出口和入口,以及迷宫内的空格数,通过私有类方法生成迷宫,并测试迷宫的可行性,再将迷宫打印出来,进行挑战(参考代码https://gitee.com/ZhongShengXueXi/codes/gthzfj6u4lp7enmrdoc8356)