认识c++(c++入门)

ops/2024/11/25 15:06:56/

1. C++关键字

C++关键字是语言本身的一部分,它们有特定的含义,并被用作程序的基础结构。以下是C++标准中定义的关键字列表:

2. 命名空间

在C++中,命名空间(Namespace)是一种用来组织代码的方法,它可以避免名称冲突。在大型项目中,当不同的开发者或模块使用相同的变量名或函数名时,命名空间可以确保每个名称在它自己的空间内保持唯一。

命名空间的基本用法

定义命名空间

你可以使用namespace关键字来定义一个命名空间。下面是一个简单的例子:

namespace myNamespace {int var = 10;void func() {std::cout << "Inside myNamespace::func()" << std::endl;}
}

 在这个例子中,myNamespace是命名空间的名称,varfunc是这个命名空间内的变量和函数。

使用命名空间成员

要使用命名空间内的成员,可以使用作用域解析运算符::

int main() {std::cout << myNamespace::var << std::endl; // 输出 10myNamespace::func(); // 调用命名空间内的函数return 0;
}

 命名空间嵌套

命名空间可以嵌套,即在一个命名空间内定义另一个命名空间。

namespace outerNamespace {int outerVar = 20;namespace innerNamespace {int innerVar = 30;}
}

 使用using指令

你可以使用using指令来简化命名空间成员的访问。

  • using声明:引入命名空间中的一个特定成员。
using myNamespace::func;
// 现在可以直接调用func(),不需要使用作用域解析运算符
func();

 

  • using编译指令:引入整个命名空间的所有成员。
using namespace myNamespace;
// 现在可以直接使用命名空间内的所有成员
std::cout << var << std::endl;
func();

无名命名空间

无名命名空间是一个特殊的命名空间,其成员在定义它们的文件中具有内部链接,这意味着它们不能在文件外部被访问。

 

namespace {int hiddenVar = 42;
}
// hiddenVar 只能在当前文件中使用

 

注意事项

  • 命名空间可以跨越多个文件,但通常将相关的声明和定义放在同一个头文件中。
  • 避免在头文件中使用using编译指令,因为这可能会导致名称冲突。
  • 使用标准命名空间(如std)时,通常只在函数或代码块内部使用using声明,而不是整个文件。

通过使用命名空间,C++代码变得更加模块化和可维护,减少了全局命名空间中的混乱。

3. C++输入&输出

在C++中,输入和输出通常是通过标准库中的iostream库来实现的,该库定义了用于输入输出的对象,如std::cin用于标准输入,std::cout用于标准输出,std::cerr用于标准错误输出。

 输出

使用std::cout可以进行标准输出,通常与插入运算符<<一起使用。

#include <iostream>int main() {std::cout << "Hello, World!" << std::endl; // 输出字符串并换行int number = 42;std::cout << "The answer is " << number << std::endl; // 输出变量值return 0;
}

 输入

使用std::cin可以进行标准输入,通常与提取运算符>>一起使用。

#include <iostream>int main() {int value;std::cout << "Enter an integer: ";std::cin >> value; // 从标准输入读取一个整数std::cout << "You entered: " << value << std::endl;return 0;
}

 

注意事项

  • 使用iostream库时,需要包含头文件<iostream>
  • std::endl是一个操纵符,它在输出流中插入一个换行符,并刷新输出缓冲区。
  • 在进行输入操作时,如果输入的类型与期望的类型不匹配,可能会导致未定义行为。
  • 可以使用std::cin.fail()来检查输入操作是否失败,如果失败,可以使用std::cin.clear()来清除错误状态,并使用std::cin.ignore()来忽略错误输入后的字符。

4. 缺省参数

在C++中,缺省参数(也称为默认参数)允许你在函数声明中为参数指定一个默认值。如果在函数调用时没有为这些参数提供值,则它们将使用这些默认值。这是非常有用的特性,它可以使函数更加灵活,并减少需要编写和维护的函数重载数量。

定义缺省参数

在函数原型中,你可以通过在参数声明后赋值来指定缺省参数

#include <iostream>// 函数声明时指定默认参数
void printInfo(const std::string& name = "Unknown", int age = -1) {std::cout << "Name: " << name;if (age >= 0) {std::cout << ", Age: " << age;}std::cout << std::endl;
}int main() {printInfo();            // 使用默认参数printInfo("Alice");     // 只提供第一个参数printInfo("Bob", 30);   // 提供所有参数return 0;
}

 在上面的例子中,printInfo函数有两个参数,nameagename的默认值是字符串"Unknown",而age的默认值是-1

注意事项

  1. 缺省参数必须从右到左提供。也就是说,如果一个参数有默认值,它右边的所有参数也必须有默认值。
  2. 函数原型和函数定义中的默认参数必须一致。如果函数原型中指定了默认参数,函数定义中可以省略这些默认值。
  3. 默认参数的值可以是常量、全局变量、函数调用等,但不能是局部变量。
  4. 当函数重载时,默认参数可能会导致调用歧义。

5. 函数重载

函数重载(Function Overloading)是C++中的一个特性,它允许在同一作用域内定义多个同名函数,只要它们的参数列表(参数的个数或类型)不同即可。编译器会根据传递给函数的参数来决定调用哪个函数。

函数重载的条件

要实现函数重载,必须满足以下条件:

  1. 函数名称相同:重载的函数必须具有相同的名字。
  2. 参数列表不同:参数的数量或参数的类型必须不同。仅仅返回类型不同不足以构成重载。
  3. 在同一作用域:重载的函数必须在同一个作用域内。

函数重载的例子

下面是一个简单的函数重载的例子:

#include <iostream>// 函数声明
void print(int num);
void print(double num);
void print(const char* str);// 函数定义
void print(int num) {std::cout << "Integer: " << num << std::endl;
}void print(double num) {std::cout << "Double: " << num << std::endl;
}void print(const char* str) {std::cout << "String: " << str << std::endl;
}int main() {print(10);         // 调用 print(int)print(3.14);       // 调用 print(double)print("Hello");    // 调用 print(const char*)return 0;
}

 在这个例子中,我们定义了三个名为print的函数,每个函数接受不同类型的参数。根据传递给print函数的参数类型,编译器会决定调用哪个函数。

注意事项

  1. 返回类型:函数重载时,返回类型不能作为区分函数的唯一标准。即你不能仅通过改变返回类型来重载函数。
  2. 缺省参数:使用缺省参数时,要注意不要造成重载的歧义。例如,如果你有两个重载函数,其中一个比另一个多一个带默认值的参数,调用时如果不提供该参数的值,可能会导致编译器无法确定调用哪个函数。
  3. 构造函数重载:在类中,构造函数也可以重载,以提供不同的初始化方式。

http://www.ppmy.cn/ops/136604.html

相关文章

lambda的作用

lambda 的定义 lambda 是 Python 中用于创建匿名函数的关键字。匿名函数是一种没有名字的函数&#xff0c;通常用来定义简单的、一次性的函数。 lambda 的语法 lambda 参数列表: 表达式 参数列表: 函数的输入&#xff0c;可以有多个&#xff0c;用逗号分隔。表达式: 函数的…

[论文阅读]Can GNN be Good Adapter for LLMs?

Can GNN be Good Adapter for LLMs? http://arxiv.org/abs/2402.12984 WWW 24: Proceedings of the ACM Web Conference 2024 研究背景和问题&#xff1a; &#xff08;1&#xff09;实际应用场景和问题提出 大型语言模型&#xff08;LLM&#xff09;在自然语言处理&…

关于分块矩阵使用Schur补求逆的相关记录

对分块矩阵 M [ A B C D ] (1) M\left[\begin{matrix} A & B \\ C & D \end{matrix}\right]\tag{1} M[AC​BD​](1) 有如下schur补和逆矩阵对比表&#xff1a; 可逆矩阵块Schur补逆矩阵A M / A D − C A − 1 B M/AD-CA^{-1}B M/AD−CA−1B [ A − 1 A − 1 B ( M…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论…

详解Qt QSettings 设置类

文章目录 QSettings 详解前言什么是 QSettings&#xff1f;QSettings 的构造函数和常用成员函数构造函数1. 默认构造函数2. 指定组织和应用名称3. 使用自定义文件 常用成员函数1. 写入设置setValue 2. 读取设置value 3. 检查键是否存在contains 4. 删除设置remove 5. 获取所有键…

20241121 android中树结构列表(使用recyclerView实现)

1、adapter-item的布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wrap_content&…

【Spring】RESTful设计风格

前言 REST(Representational State Transfer),即“表现层状态转移”,它定义了互联网软件服务的架构原则。如果一个架构的符合 REST 原则&#xff0c;就被称之为 RESTful 架构&#xff0c;这是目前最流行的互联网软件服务架构设计风格之一。 REST 并不是一种标准&#xff0c;…

深度学习中的循环神经网络(RNN)与时间序列预测

一、循环神经网络&#xff08;RNN&#xff09;简介 循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;简称RNN&#xff09;是一种专门用于处理序列数据的神经网络架构。与传统神经网络不同&#xff0c;RNN具有内部记忆能力&#xff0c;能够捕捉数据中的时间依赖…