20天刷完c++ primer(一)一天一部分,一天一古风美女

涉及的资源下载

C++ Primer, 5th Edition | InformIT 在官网中便可以下载到样例中使用的代码(虽然对我们来说没什么作用,我觉得学习编程语言的最快速的方法是去写项目(后面会有涉及))

本文所使用的ide是vs2022

主要是vs太强了,其实对于c++11来说dev勉强够用,但是为了以后学习c++17等语法我的建议是使用vs或vscode(需要自己搭建环境)或者clion等;

注:本文会跳跃式的吧c++知识点串联起来

主要是博主写文章的目的是加强对c++语法的熟悉使用(后面博主会持续更新项目的编写以及Linux等相关技术栈)

注:本文每次会在开头回顾上一章的知识点以及上一章博主所犯的错误,希望每章后大家能帮博主纠正,十分感激!!!

编写一个简单的c++程序

1.第一个问题?为什么要有main函数?

在 C++ 程序中,每个独立的可执行程序都必须有一个主函数(main function)。主函数是程序的入口点,它指定了程序开始执行的位置。当程序运行时,操作系统会首先定位程序的主函数,并从该函数开始执行程序。

在 C++ 中,主函数的原型通常为:

int main()
{
    // 程序代码
    return 0;
}

其中,int 表示主函数的返回类型是整型,main 是函数名,() 中可以包含参数列表(通常为空),return 0 表示函数返回值为 0,表明程序成功结束。

主函数中的代码是程序的核心,它包含了程序的执行逻辑。在主函数中,可以定义变量、调用函数、控制程序的流程等。主函数执行完毕后,程序将返回一个整型值,该值将被操作系统用作程序的退出状态码,通常 0 表示程序正常结束,其他值则可能表示程序出现错误或异常终止。

总之,主函数是 C++ 程序的必备部分,它指定了程序的入口点和执行逻辑,并且为程序提供了退出状态码

2.第二个问题?内置类型与定义类型本质上的区别是什么?

在 C++ 中,内置类型(built-in type)和定义类型(defined type)的本质区别在于它们是如何定义和实现的。

内置类型是 C++ 语言本身定义的基本数据类型,包括整型、浮点型、字符型、布尔型等。这些类型在编译器内部已经被实现,可以直接使用。内置类型的行为和性能通常是由编译器和底层硬件决定的,因此它们的使用非常高效。

定义类型则是由程序员自行定义的类型,包括结构体、类、枚举等,也可以是由内置类型经过组合和封装而来的自定义类型。定义类型的行为和性能通常是由程序员自行决定的,因此它们的使用灵活度更高,但也可能会带来一定的性能开销

此外,内置类型和定义类型在语法层面上也有一些区别。例如,内置类型可以在不声明变量的情况下直接使用,而定义类型必须先定义后才能使用。另外,内置类型可以直接进行算术运算、位运算等操作,而定义类型需要自行实现相应的运算符重载函数才能进行这些操作。

总之,内置类型和定义类型在定义和实现上有本质的区别,它们的使用场景和行为也有所不同。

3.第三个问题?算法运算,位运算又是啥?定义运算重载函数要怎么使用?

算法运算(Arithmetic Operations)是指在计算机中进行数学运算的操作,包括加、减、乘、除等常见运算。在 C++ 中,内置类型支持常见的算法运算;对于自定义类型,程序员可以通过运算符重载来自定义运算行为。

位运算(Bitwise Operations)是指在计算机中对二进制位进行操作的操作,包括按位与、按位或、按位异或等。位运算通常用于处理二进制数据和位标志,例如在通信、图像处理、加密等领域中都有广泛的应用。

注:算法运算和位运算本质的区别是(算法运算是针对数值的,而位运算是针对二进制位的。)

在 C++ 中,运算符重载是指对已有运算符进行重新定义,使其适用于自定义类型。例如,可以为自定义类型重载加法运算符 +,使其能够对两个对象进行相加操作。运算符重载函数的命名规则为 operator 关键字后跟着对应运算符的符号,例如 operator+ 表示重载加法运算符。

定义运算重载函数的一般步骤如下:

  1. 在自定义类型中声明运算符重载函数。例如,定义一个自定义类型 MyClass,并为其重载加法运算符:

class MyClass {
public:
    MyClass operator+(const MyClass& other) const;
};
  1. 在类的实现文件中实现运算符重载函数。例如,在上述示例中,实现加法运算符重载函数应为:

MyClass MyClass::operator+(const MyClass& other) const {
    // 实现自定义类型的加法运算逻辑
    MyClass result;
    // ...
    return result;
}
  1. 在程序中使用运算符重载函数。例如,可以使用重载的加法运算符对两个 MyClass 对象进行相加:

MyClass a, b, c;
// ...
c = a + b;  // 使用重载的加法运算符

在实现运算符重载函数时,需要注意保持重载函数的语义与对应运算符的语义一致,遵循运算符的优先级和结合性规则,以避免产生歧义和错误。另外,运算符重载函数的返回值类型应与运算符的语义相一致,以保证程序的正确性和可读性。

4.问题四:我们怎么把我们写的一个.c文件变成.exe文件(这里涉及到一些操作系统的知识点,我们大致的给大家过一遍,详细的我们后面会随着我们系统的学习慢慢的展开)

  1. 编写 C 语言源文件。这是程序的源代码,通常使用文本编辑器编写。(我们刚刚停留这这个阶段)

  2. 使用编译器将源文件编译成目标文件(.obj 文件或 .o 文件)。编译器会将源代码翻译成可执行机器码,但还无法直接运行。例如,在 Windows 平台上,可以使用 Microsoft Visual Studio 自带的编译器(cl.exe)进行编译,命令如下:

cl /c source.c

这将生成一个名为 source.obj 的目标文件。

  1. 使用链接器将目标文件链接成可执行文件。链接器会将目标文件和所需要的库文件合并成一个可执行文件,使其能够在操作系统上运行。例如,在 Windows 平台上,可以使用以下命令将目标文件链接成可执行文件:

link source.obj

这将生成一个名为 source.exe 的可执行文件。

当然,上述步骤可以合并为一个命令,例如在 Windows 平台上,可以使用以下命令将源文件编译并链接成可执行文件:

cl source.c

这将生成一个名为 source.exe 的可执行文件。

需要注意的是,在实际编译过程中,可能需要指定编译选项、库文件等参数,以满足不同的编译需求。另外,不同的操作系统和编译器可能有不同的编译和链接方式,具体细节需要根据实际情况进行调整。

具体如下图

 

第五个问题:当我们使用太多的库函数的时候,难免会产生冲突,我们要怎么解决呢?

5.1 使用命名空间。将库函数和自己的代码放在不同的命名空间中,可以避免命名冲突。

5.2 使用别名。可以使用 typedefusing 关键字为某个库函数创建一个别名,使得可以使用不同的名称来访问同一个函数。

5.3 修改库函数名称(不现实),修改自己代码中的函数名(不显示),避免使用库函数(不限时);

C++ 还提供了一些额外的机制和语言特性,可以更加方便地解决库函数冲突的问题,例如:

  1. 使用 using 声明。使用 using 声明可以将某个命名空间中的标识符引入到当前作用域中,从而可以直接使用该标识符,而无需使用命名空间限定符。例如:

using std::cout;
using std::endl;

这样可以直接使用 coutendl,而无需使用 std::coutstd::endl

  1. 使用 using namespace 语句。使用 using namespace 语句可以将某个命名空间中的所有标识符引入到当前作用域中,从而可以直接使用该命名空间中的所有标识符,而无需使用命名空间限定符。例如:

using namespace std;

这样可以直接使用 coutendl 等标准库函数,而无需使用 std::coutstd::endl 等命名空间限定符。

需要注意的是,使用 using 声明或 using namespace 语句可能会引入意想不到的命名冲突,因此应该谨慎使用,尤其是在头文件中。另外,在使用第三方库时,应该尽可能使用官方提供的命名空间或别名规范,以避免命名冲突的发生。

初识输入与输出

在 C++ 中,可以使用标准输入输出库(iostream)来实现输入和输出操作。iostream 库提供了多种输入输出方式,包括:

  1. 标准输入输出(cin 和 cout):使用 cincout 对象可以实现标准输入和输出,分别对应键盘输入和屏幕输出。例如:

#include <iostream>
​
using namespace std;
​
int main() {
    int num;
    cout << "Enter a number: ";
    cin >> num;
    cout << "You entered: " << num << endl;
    return 0;
}
  1. 文件输入输出(ifstream 和 ofstream):使用 ifstreamofstream 对象可以实现文件输入和输出,分别对应文件读取和文件写入。例如:

#include <iostream>
#include <fstream>
​
using namespace std;
​
int main() {
    ofstream outfile("example.txt");
    outfile << "This is a test." << endl;
    outfile.close();
​
    ifstream infile("example.txt");
    string line;
    while (getline(infile, line)) {
        cout << line << endl;
    }
    infile.close();
    return 0;
}
  1. 字符串输入输出(istringstream 和 ostringstream):使用 istringstreamostringstream 对象可以实现字符串输入和输出,分别对应字符串读取和字符串构造。例如:

#include <iostream>
#include <sstream>
​
using namespace std;
​
int main() {
    string str = "123 4.56 true";
    istringstream iss(str);
    int num;
    double d;
    bool b;
    iss >> num >> d >> boolalpha >> b;
    cout << "Num: " << num << endl;
    cout << "Double: " << d << endl;
    cout << "Bool: " << boolalpha << b << endl;
​
    ostringstream oss;
    oss << "Hello " << "World!";
    string result = oss.str();
    cout << result << endl;
    return 0;
}

需要注意的是,在进行输入操作时,应该注意输入数据的类型和格式,以避免数据类型不匹配或格式错误的问题。在进行输出操作时,应该注意输出数据的格式、精度和对齐方式,以便使输出结果易于阅读和理解。

注意:while(cin>>n)

cin >> n 读取到一个整数时,会返回 true,循环体中的语句会被执行;当 cin >> n 读取失败时(例如输入了一个非整数的字符),会返回 false,循环会结束。我们使用这种方式的话可以进行持续输入(竞赛中可以会用到);

注释写法

//

/* */

注:注释不能嵌套

控制流

主要语法 while(),for(;;),if() else{},switch();等语法的使用;

while ()

while 是 C++ 中的一种迭代控制结构,用于重复执行一段代码,直到指定的循环条件不再满足为止。while 循环的基本语法如下:

while (condition) {
    // 循环体
}

其中,condition 是循环条件,可以是任何能够产生布尔值(即 truefalse)的表达式。当 condition 的值为 true 时,while 循环会重复执行循环体中的语句;当 condition 的值为 false 时,循环结束,程序会跳出 while 循环,继续执行循环体之后的代码。

while 循环中,循环体会一直重复执行,直到循环条件不再满足为止。因此,需要注意循环条件的设置,以避免循环陷入死循环。

在循环体中,可以使用各种语句和控制结构,例如 if-elseforswitchbreakcontinue 等,以及自定义的函数和对象。需要注意的是,在循环体中应该尽量避免使用无限循环,以免程序陷入死循环,导致程序崩溃或无法正常执行

for()

for 是 C++ 中的一种迭代控制结构,用于重复执行一段代码,通常用于已知循环次数的情况。for 循环的基本语法如下:

for (initialization; condition; update) {
    // 循环体
}

其中,initialization 是循环初始化语句,用于初始化循环变量;condition 是循环条件,用于判断循环是否继续执行;update 是循环更新语句,用于更新循环变量的值。当 condition 的值为 true 时,for 循环会重复执行循环体中的语句;当 condition 的值为 false 时,循环结束,程序会跳出 for 循环,继续执行循环体之后的代码。

for 循环中,循环变量的值会在每次循环结束后按照 update 中指定的方式进行更新。因此,需要注意循环变量的初始值和更新方式,以确保循环能够正确地执行。

在循环体中,可以使用各种语句和控制结构,例如 if-elsewhileswitchbreakcontinue 等,以及自定义的函数和对象。需要注意的是,在循环体中应该尽量避免使用无限循环,以免程序陷入死循环,导致程序崩溃或无法正常执行。

if() else{}

if 语句用于判断一个条件是否成立,如果成立,则执行 if 语句后面的代码;否则,跳过 if 语句,继续执行后面的代码。else 语句可选,用于在 if 条件不成立时执行一些其他的代码。

ifelse 的基本语法如下:

if (condition) {
    // 如果 condition 成立,则执行这里的代码
} else {
    // 如果 condition 不成立,则执行这里的代码
}

其中,condition 是一个表达式,用于判断条件是否成立。如果 condition 的值为 true,则执行 if 语句后面的代码;否则,执行 else 语句后面的代码。else 语句是可选的,如果省略了 else 语句,则在 if 条件不成立时不执行任何代码。

需要注意的是,ifelse 语句只能控制它们后面的一条语句或者语句块,如果需要控制多条语句,需要使用花括号 {} 将它们组合成一个语句块。

switch()

switch 是 C++ 中的一种条件语句,用于根据一个表达式的值执行不同的代码块。switch 语句通常用于替代多个 if-else 语句的情况,可以使代码更加简洁和易读。

switch 语句的基本语法如下:

switch (expression) {
    case value1:
        // 如果 expression 的值等于 value1,则执行这里的代码
        break;
    case value2:
        // 如果 expression 的值等于 value2,则执行这里的代码
        break;
    // ...
    default:
        // 如果 expression 的值不等于任何一个 case 中的值,则执行这里的代码
        break;
}

其中,expression 是一个表达式,用于进行比较。case 语句用于判断 expression 的值是否等于指定的值。如果 expression 的值等于某个 case 中指定的值,则执行该 case 语句后面的代码,直到遇到 break 关键字为止。default 语句是可选的,当 expression 的值不等于任何一个 case 中指定的值时,执行 default 语句后面的代码。

需要注意的是,每个 case 语句后面必须跟一个 break 关键字,否则程序会继续执行下一个 case 语句的代码,直到遇到 break 关键字为止。如果省略了 break 关键字,则会发生所谓的 "fall-through",即程序会顺序执行下一个 case 语句的代码,直到遇到 break 关键字为止。

类简介

在 C++ 中,类(class)是一种用户自定义的数据类型,用于封装数据和行为。类定义了一组属性(数据成员)和方法(成员函数),可以创建具有相同属性和方法的多个对象。类是面向对象编程的基础,它提供了一种抽象数据类型的定义方式,使得程序员可以更加方便地组织代码、封装数据、隐藏实现细节,从而提高代码的可维护性和可重用性。

类的定义格式如下:

class ClassName {
    // 数据成员
    // 成员函数
};

其中,ClassName 是类名,可以由字母、数字和下划线组成,习惯上首字母大写。数据成员和成员函数可以是公有的(public)、私有的(private)或受保护的(protected),默认情况下是私有的。公有的成员可以在类外部访问,私有的成员只能在类内部访问,受保护的成员可以在类及其子类中访问。

下面是一个简单的类的示例:

class Rectangle {
public:
    // 构造函数
    Rectangle(double width, double height) {
        this->width = width;
        this->height = height;
    }
​
    // 成员函数
    double getArea() {
        return width * height;
    }
​
private:
    // 数据成员
    double width;
    double height;
};

在这个例子中,Rectangle 是一个类,包含了两个私有的数据成员 widthheight,以及一个公有的成员函数 getArea。构造函数用于初始化数据成员,成员函数用于计算矩形的面积。

可以使用以下代码创建一个 Rectangle 对象,并调用它的 getArea 函数:

Rectangle rect(3.0, 4.0);
double area = rect.getArea();

在这个例子中,rect 是一个 Rectangle 对象,它的宽度为 3.0,高度为 4.0。调用 rect.getArea() 函数将返回矩形的面积 12.0。

除了构造函数和成员函数之外,类还可以包含静态成员、常量成员、成员对象等。C++ 中的类还支持继承、多态等面向对象编程的特性,这些特性使得类成为了 C++ 中最重要和最强大的语言特性之一。

总结在第一天的学习中我们学到了一个我们用代码编辑器写的.c文件是怎么编成.exe文件,我们学习了一些简单的语法以及一些语法的特点,一天的学习我们能大致搞定了一个简单的c++程序要怎么编写,我们现在能在小黑框里面干什么?我们输入与输出的方式有那一些?我们要怎么写注释,在后面csapp中我们将学会要怎么优化我们的代码,这个栏目的目的是带我们快速的过一遍c++的基础语法以及概念等,我们后面更新项目实际操作的时候将接着回顾c++的语法!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值