当前位置: 首页 > news >正文

《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说明:

  1. 如果 using namespace语句用在函数内,则此声明只在函数内执行处向下有效,在函数调用结束后名字空间失效。

    1. 如果 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, ...;

说明:

  1. 引用型变量必须在创建时进行初始化。
  2. 引用型变量在创建后无法改变绑定关系。
  3. 引用型变量的类型必须和关联的变量类型完全一致。

引用示例

#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;
}
http://www.dtcms.com/a/389217.html

相关文章:

  • NVR接入录像回放平台EasyCVR海康设备视频平台视频监控系统常见故障与排查全解析
  • 半导体制造常提到的Fan-Out晶圆级封装是什么?
  • Qt 系统相关 - 文件
  • P2242 公路维修问题
  • 安装wsl
  • 牛客多校04C :Computational Geometry Problem(p-Dyck路计数)
  • CMake+visual studio 2022 +qt6 , 从Linux平台移植到windows下平台开发
  • 大模型系列——Playwright MCP 可以复用 Chrome 登录态了
  • 三星S25 Edge 与iPhone 17 Air:最新对比
  • 电脑怎么连接wifi?【图文详解】笔记本电脑怎么连接无线wifi?笔记本电脑连不上wifi怎么办?
  • 设计模式-代理模式详解
  • 怎样让AI图生3D更加高质高效
  • Java 集合框架 Set 接口:实现类的底层数据结构与核心特点
  • 【大模型】使用Qwen-VL大模型进行验证码识别的完整指南
  • 深度学习体系化入门:从理论到实践的完整框架
  • 餐饮行业系统集成分享:OMS 订单数据推送ERP 核算
  • 深入剖析OpenHarmony ClearPlay DRM驱动:从HDI接口到动态加载的完整实现路径
  • [WesternCTF2018]shrine
  • 硬件 - RK3588部分(2) - 原理图 - 最小系统
  • Android进阶之路 - 从 URL Scheme 到 Deep Link 与 App Link
  • MySQL监控Shell脚本实战指南
  • 【Android】Jetpack Media3 如何播放音频文件 实现视频播放器
  • Android 开发 集成 uni 小程序,并实现相互通信
  • 【office】怎么设置第一章二级标题为1.1 1.2 1.3然后第二章为2.1 2.2 2.3这样子
  • JVM的垃圾回收机制(一次完整的GC流程)
  • 拥抱新一代 Web 3D 引擎,Three.js 项目快速升级 Galacean 指南
  • Linux 内核裁剪与功能扩展实验报告
  • Qt QVCandlestickModelMapper详解
  • LeetCode:20.旋转图像
  • 网络协议深度解析:从OSI七层模型到现代互联网通信的技术实战