《C++程序设计》笔记
C++简介
- C++ 全称 C plus plus
- 创建年份:1979年
- 创始人:本贾尼.斯特朗斯特鲁普(Bjarne Stroustrup)
C++的开发环境
- 操作系统:Linux
- 编译器: g++
- 编辑器: vim
C++的官方文档:
https://en.cppreference.com/
源文件:
- 后缀 (常用):
.cpp
- 后缀(不常用):
.cxx
安装 g++ 编译器
sudo apt install g++
第一个C ++程序
// #include <stdio.h>
#include <iostream>int main(int argc, char * argv[]) {// printf("Hello World\n");std::cout << "Hello World!" << std::endl;std::cout << "abc" << 123 << "ABC" << std::endl;return 0;
}
编译方法
g++ -o hello hello.cpp
C++的命名空间(namespce)
命名空间也叫名字空间,是一个标识符的范围空间。
语法:
namespace 命名空间名 {// 此处定义此空间内的变量和函数、类等。
} // 注意:此处没有分号。
名字空间内标识符的使用方法(有两种)
方法1:
名字空间名::名字空间内的标识符
方法2:
using namespace 名字空间名;// 一下可以直接使用名字空间内的标识符
using namespace说明:
如果
using namespace
语句用在函数内,则此声明只在函数内执行处向下有效,在函数调用结束后名字空间失效。
- 如果
using namespace
语句用在函数外。则名字空间在using namespace 语句调用时起。到文件结束前一直有效。
示例
#include <iostream>// 定义英文运行环境的名字空间
namespace english_env {const char * mystr = "Hello";void say_hello(const char * name) {std::cout << mystr <<" "<< name <<std::endl;}
}// 定义中文运行环境的名字空间
namespace chinese_env {const char * mystr = "你好";void say_hello(const char * name) {std::cout << mystr <<" "<< name <<std::endl;}
}int main(int argc, char * argv[]) {std::cout << "Hello World!" << std::endl;// 方法1chinese_env::say_hello("魏老师");english_env::say_hello("魏老师");std::cout << chinese_env::mystr << std::endl;// 方法2using namespace english_env;say_hello("张老师");std::cout << mystr << std::endl;using namespace std;cout << "aaaaaaaaaaa" << endl;return 0;
}
C++的标准输入输出
<iostream> 说明
cout
是 otream类型的对象,负责输出。
代替 printf(3)
cin
是 istream类型的对象,负责输入。
#include <iostream>using namespace std;int main(int argc, char * argv[]) {// 这一行cout << "姓名:" << "老魏" << "年龄" << 35 << endl;// 等同于cout << "姓名:";cout << "老魏";cout << "年龄";cout << 35 ;cout << endl;return 0;
}
标准输入:
使用 cin 对象和 >> 运算符可以实现 输入:
代替 scanf(3)
示例:
#include <iostream>using namespace std;int main(int argc, char * argv[]) {int age;float height;std::string name; // 创建一个string 对象,namecout << "请输入年龄:";cin >> age;cout << "请输入身高:";cin >> height;cout << "请输入姓名:";cin >> name;cout << "姓名:" << name;cout << "年龄:" << age << " 身高:" << height << endl;return 0;
}
std::string 类
C ++ 标准库中的类,用于代替 char * str, 方便使用
示例
#include <iostream>using namespace std;int main(int argc, char * argv[]) {// C 标准的类型: char、short int、int 、long int// long long int、 float、double// 字符串: char buf[100];string s1; // 创建一个string 对象,s1s1 = "hello";string s2 = "world!";string s3 = s1 + " " + s2; // 字符串拼接cout << "s3:" << s3 << endl;return 0;
}
字符串常用的运算符
+ // (string + string 或 char*)用于拼接字符串
+= // 追加字符串
== // 比较字符串相等
!= // 比较字符串不相等
[整数] // 用于返回某个位置的字符串。
字符串常用的成员函数(其他语言(java、python)中的方法)
.size() 或 .length() // 返回字符串的长度。
.empty() // 返回字符串是否为空。
.append(...) // 追加字符串。
.push_back(char n) // 追加单个字符。
.find(const string & str, size_t pos=0) 查找首次出现的位置。
.c_str() // 返回C 语言中的 const char * 指针.
示例
#include <iostream>
#include <stdio.h>using namespace std;int main(int argc, char * argv[]) {// C 标准的类型: char、short int、int 、long int// long long int、 float、double// 字符串: char buf[100];string s1; // 创建一个string 对象,s1s1 = "hello";string s2 = "world!";string s3 = s1 + " " + s2; // 字符串拼接cout << "s3:" << s3 << endl;cout << "s3的长度:" << s3.size() << endl;printf("s3的第二个字符:%c\n", s3[1]);s1 += "."; // 将 "." 追加到字符串末尾cout << "s1:" << s1 << endl; // "hello."cout << (s1 == "ABC") << endl; // 判断 s1是否和"ABC"相等, 0 表示假值,1表示真值;printf("s1:%s\n", s1.c_str()); // 返回s1的字符串首地址cout << (int)s1.find("ll") << endl; // 字符内容查找。找不到返回 -1, 找到返回位置return 0;
}
函数的缺省参数(default argument)
作用:
用于在不给定参数值使用缺省值作为实参,方便使用。
语法:
返回类型 函数名/或成员函数名(形参类型 形参名1[ = 缺省值1],形参类型 形参名2[ = 缺省值2], ...) {
}
说明:
缺省参数必须自右至左依次存在。
示例:
#include <iostream>
#include <stdio.h>using namespace std;int myadd(int a=0, int b=0, int c=0, int d=0) {return a + b + c + d;
}int main(int argc, char * argv[]) {int ret;ret = myadd(1, 2, 3, 4);cout << "ret:" << ret << endl;ret = myadd(10, 20, 30);cout << "ret:" << ret << endl;ret = myadd(100, 200);cout << "ret:" << ret << endl;return 0;
}
布尔类型(bool):
C++ 里新增了布尔类型,用于表示布尔类型:
类型名:bool
布尔类型的值:
true 表示真(值为1)
false 表示假(值为0)
布尔类型相关关键字:
bool true false
C++ 全部的关键字
见官方文档:https://en.cppreference.com/w/cpp/keywords.html
示例:
#include <iostream>
#include <stdio.h>using namespace std;int main(int argc, char * argv[]) {bool b; // 一个字节cout << sizeof(b) << endl;b = true;cout << "b:" << b << endl;b = false;cout << "b:" << b << endl;return 0;
}
函数重载(function overload)
什么是函数重载:
函数重载是指C++允许有相同的函数名称,但参数列表的个数和类型不同的函数(对返回值类型没有要求,不根据返回值进行区别)。
函数调用时会根据实际参数的类型和个数自动匹配相应函数
区别:
- 参数个数不同
- 参数的类型不同
- 参数的顺序不同。
说明:
重载是编译器将函数名根据参数类型添加名称前缀来实现的。如
$ nm 09_function_overload.o
000000000000005d T _Z6myswapPfS_ # void myswap(float*,float*);
0000000000000000 T _Z6myswapPiS_ # void myswap(int*,int*);
引用(refrence)
引用:相当于变量别名,是指针的另一种用法。
定义引用型变量的语法:
变量类型 & 变量名1, & 变量名2, ...;
说明:
- 引用型变量必须在创建时进行初始化。
- 引用型变量在创建后无法改变绑定关系。
- 引用型变量的类型必须和关联的变量类型完全一致。
引用示例
#include <iostream>
#include <stdio.h>using namespace std;int main(int argc, char * argv[]) {int x = 100;int &rx = x; // rx为引用类型的变量,绑定x;cout << "x:" << x << "rx:" << rx << endl;x = 200;cout << "x:" << x << "rx:" << rx << endl;rx = 300;cout << "x:" << x << "rx:" << rx << endl;return 0;
}
引用作为函数的参数,在函数内部可以使用引用的形参变量访问实参。可以避免指针解引用的麻烦,并且使程序的可读性变得更好。
示例
#include <iostream>
#include <stdio.h>using namespace std;void myswap(int &pa, int &pb) {cout << "void myswap(int &pa, int &pb)" << endl;int temp = pa;pa = pb;pb = temp;
}
void myswap(float &pa, float &pb) {cout << "void myswap(float &pa, float &pb)" << endl;float temp = pa;pa = pb;pb = temp;
}int main(int argc, char * argv[]) {int x = 100, y = 200;float a = 3.14, b = 2.71828;myswap(x, y);myswap(a, b);cout << "x:" << x << "y:" << y << endl;cout << "a:" << a << "b:" << b << endl;return 0;
}
auto 类型自动推断
auto 是类型占位符,用于自动推断类型。
语法:
auto 变量名 = 变量值。
关键字
auto
说明
- auto 类型的变量会自动丢弃 const 属性和 引用属性。
示例
#include <iostream>
#include <stdio.h>using namespace std;int main(int argc, char * argv[]) {const int x = 100;auto pi = 3.14; // pi 为 double 类型auto i = 200; // i 为int 类型auto ax = x; // ax 为int类型,丢弃const属性double & rpi = pi;auto api = rpi; // api 为 double 类型的变量,丢弃引用属性cout << "sizeof(pi):" << sizeof(pi) << endl;return 0;
}
inline 内联函数
作用:
将函数内部的代码展开放入到调用的地方。减少函数参数压栈和弹栈的开销,提高程序的运行速度。
语法:
inline 返回类型 函数名(参数列表) {}
关键字
inline
说明:
- C11 标准也支持 inline
inline 示例
#include <iostream>
#include <stdio.h>using namespace std;inline void myswap(int &pa, int &pb) {int temp = pa;pa = pb;pb = temp;
}
// #define myswap(pa, pb) { \
// int temp = pa; \
// pa = pb; \
// pb = temp; \
// }int main(int argc, char * argv[]) {int x = 100, y = 200;cout << "x:" << x << ", y:" << y << endl;myswap(x, y);cout << "x:" << x << ", y:" << y << endl;return 0;
}
C ++ 中的结构体 struct
C ++ 的结构体允许包含函数(称之为成员函数)。
语法:
struct 结构体名 {类型1 成员变量名1;类型2 成员变量名2;...返回类型1 成员函数名1(参数列表1) { }返回类型1 成员函数名1(参数列表1) { }
};
结构体示例
#include <iostream>
#include <stdio.h>using namespace std;struct student {std::string name;int age;inline void set_age(int new_age) {age = new_age;}void show_info(void) {cout << "姓名:"<<name << ",年龄:" << age<< endl;}
};
int main(int argc, char * argv[]) {student s1 = {"张三", 20}, s2 = {"李四", 16};s1.show_info();s1.set_age(21);s1.show_info();s2.show_info();return 0;
}