//这本书可以是你的七点,但绝不能够是你的终站。
//OOP——面向对象编程
第一章 C++编程基础
基础数据类型-运算符-控制语句-复合类型-抽象化库
1.1 如何撰写C++程序
每个C++程序都是从一个名为main的函数开始执行。main函数返回整数类型,习惯上程序执行无误时返回0。return是关键字。
所谓诸如int的关键字(keyword),就是程序语言预先定义的一些具有特殊意义的名称。
函数(function)是一块独立的程序代码序列,能够执行一些运算。它包括返回值类型、函数名称、参数列表、函数体四个部分。函数名最好能够提供某些信息,让我们容易了解函数实际上在做些什么。参数列表用来表示“函数执行时,调用者可以传给函数的类型列表”。
//注释的撰写是为了便于阅读者更容易理解程序。
数据的输入和输出并非是C++程序语言本身定义的一部分,而是由一套面向对象的类层次体系提供支持,并作为C++标准库的一员。“输入/输出库”<iostream>,cout,cin,endl
#include <iostream>
using namespace std;
cout << "Please enter your first name: ";
所谓类(class),是用户自定义的数据类型,赋予了我们“增加程序内之类型抽象化层次”的能力。其定义一般分为声明该class所提供的各种操作行为的头文件和包含操作行为的实现内容的程序代码文件。面向对象的类层次体系定义了整个家族体系的各相关类型。
语句是C++程序的最小独立单元,以分号作为结束。
#include <string>
string user_name;
cin >> user_name;
所谓字符常量系由一组单引号括住。第一类是可打印字符(英文字母、数字、标点符号),另一类是不可打印字符(换行符\n,制表符\t)。字符串常量可以同时包括两类字符。
using和namespce都是关键字,std是标准库所驻之命名空间的名称。标准库所提供的任何事物都被封装在命名空间std内。所谓命名空间,是一种将库名称封装起来的方法,可以避免和应用程序发生命名冲突的问题。
1.2 对象的定义与初始化
欲定义一个对象,必须指定其数据类型,再给定其标识符。称为“声明语句”。对象名称可以是任何字母、数字、下划线的组合,区分大小写,不能以数字开头,不能与关键字一致。数据类型决定了对象所能持有的数值范围,同时决定该对象占用的内存空间。
C++内置的数据类型:Boolean、integer、floating point、character(bool、int、float、char)
两种初始化的方法:
int num_tries = 0, num_right = 0;//用assignment运算符=初始化,沿袭自C语言
int num_tries(0);//多值初始化的构造函数初始化语法
<>表示模板类(template class),允许我们在“不必指明数据成员类型”的情况下定义类。程序员知道使用该模板类时才决定真正的数据类型。
#include <complex>
complex<double> purei(0,7);
const关键字使得我们可以表示常量的对象,其内容在程序执行过程中不会有所变动。
const int max_tries = 3;
1.3 撰写表达式
条件运算符:
expr
? 若expr=true,执行该语句
:若expr=false,执行该语句
复合赋值:+= -= *= /= %=
递增递减运算符:++ --
新手常犯的错误便是将赋值=和相等==混用。
逻辑运算符:&& || !
运算优先级是C++编程之所以复杂的原因之一。
1.4条件语句和循环语句
main中的每行语句只会被依序执行一次。if语句让我们依据某个表达式的结果来决定是哦福执行一条火多条连续语句。
嵌套的if-else子句的逻辑容易令人困惑。
如果测试条件值属于整数类型,可以用switch-case-break-default代替。
while-break-continue循环。
1.5如何运用array和vector
可存放连续整数值的容器container类型,不仅可以以名称name取用其中元素,也可以索引。
C++允许我们以内置的array类型或标准库提供的vector类来定义容器。
定义array:元素类型、名称、元素个数(必须常量)
初始化array:初始化列表(全部或部分元素,其余默认为0)
const int seq_size = 18;
int pell_seq[seq_size];
int elem_seq[seq_size]={1,2,3,4,5,6,7,9,0,10};
定义vector:头文件、元素类型、大小(可以非常量)
初始化vector:一个个赋值或者用array来初始化
求vector大小:vector名.size()
#include <vector>
vector<int> pell_seq(seq_size);
elem_seq[0]=1;
int elem_val[seq_size]={1,2,3,4,5,6,7,9,0,10};
vector<int> elem_seq(elem_val,elem_val+seq_size);
索引[],off-by-one。
1.6指针带来弹性
指针pointer代表某特定内存地址,而不是直接操作对象。定义某个特定类型的指针时,在类型名称前面加上*号。取址运算符&。
int *pi = &ival;//指针初值赋值为ival所在的内存地址。
提领dereference操作——取得“位于该指针所指内存地址上”的对象。
*pi = 1024;
指针具有的双重性质:操作内存地址和操作对象值。
null指针不指向任何对象。
if (pi && *pi != 1024)//检查指针地址是否为0
if(!pi)
伪随机数生成:
#include <cstdlib>
srand(seq_cnt);//随机数生成器种子seed
seq_index = rand() % seq_cnt;//返回0-max(int)之间的数
current_vec = seq_addrs[seq_index];
使用class对象的指针改用arrow成员选择运算符:
pv && !pv->empty()
1.7文件的读写
#include <fstream>
outstream outfile(filename);
outstream outfile(filename,ios_base::app);//追加模式打开
ifstream infile(filename);
fstream iofile(filename,ios_base::in|ios_base::app);
确认打开成功:
if(!outfile)
cerr代表标准错误设备,无缓冲,立即显示在用户终端。(和cout类似)
将文件重新定位至起始处:
iofile.seekg(0);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)