零、C++基本语法

命名空间

功能:

解决符号名称冲突的方法

语法:

namespace <命名空间名称>
{
	//代码
}

使用:

局部引用:

	 **&lt;命名空间名字&gt; :: &lt;函数名/变量名/类名&gt;**

全部引用:

	引用整个命名空间的内容:	

		**using namespace &lt;命名空间的名字&gt;;**      

	引用命名空间内单个元素符号:	

		**using &lt;命名空间的名字&gt; :: &lt;命名空间内元素符号&gt;**
::
域操作符,用于访问作用域
#include <iostream>

using namespace std;

namespace mySpace
{
	int a = 10;
}

int main()
{
	int a = 20;
	cout << "a = " << a << endl; //20
	cout << "mySpace::a = " << mySpace::a << endl; //10
	return 0;
}

命名空间取别名:

一个命名空间可以取多个别名,使用别名和原名无任何区别
namespace mySpace
{
	int a;
}

namespace mySpace2 = mySpce;

匿名命名空间:

定义自己的命名空间时不需要取名字,可以直接使用里面的函数或者变量,但只在当前文件内生效

#include <iostream>

namespace mySpace
{
	int a = 10;
}
namespace
{
	int a = 50;
}

int main()
{
	cout << "a = " << a << endl; //50
	cout << "mySpace::a = " << mySpace::a << endl; //10
	return 0;
}

using:

功能一:

	using namespace 将一个命名空间中的所有名词导入到当前作用域中,从而可以直接使用该命名空间中的所有名称吗,而不必使用作用域解析运算符(::)
#include <iostream>

namespace mySpace
{
	int a = 10;
}

int main()
{
	using namespace mySpace;
	cout << "a = " << a << endl; //10
	return 0;
}

功能二:

	**定义别名**

**using INT = int**   <==> tyepdef int INT;

C++输入输出

C++中输入输出通过的方式来实现

流运算符:
 **&lt;&lt;**  输出运算符

 **&gt;&gt;**  输入运算符
定义:
//cin = control-in

cin  标准输入对象:

	输入类型不匹配会返回空

	消除了scanf连续输入多次字符时产生垃圾字符的缺点

//cout = control-out

cout 标准输出对象

	设置域宽:cout.width(5),设置域宽为5

	cout输出顺序从左往右,运算顺序从右往左(右边的先算,最后打印)

endl 换行操作
设置域宽:
cout.width(5),设置域宽为5
标准设置:
oct 八进制

hex 十六进制

dec 十进制

showbase 显示前缀
使用cin和cout注意点:
需要包含iostreanm头文件

引用标准命名空间std
#include <iostream>

using namespace std;


int main(int argc, const char *argv[])
{
    int a = 0, b = 0;

    cin >> a >> b;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    //cout.width(5);
    cout << showbase;
    cout << oct;
    cout << "a = " << a << endl;

    cout << hex;
    cout << "a = " << a << endl;
  
    cout << dec;
    cout << "a = " << a << endl;
	return 0;
}

cout的执行顺序和输出顺序

cout执行顺序:从右往左执行

cout输出顺序:从左往右执行

C++函数

带默认值的函数

定义:

C++中存在带默认值的函数,即使不传参也会按默认值参数运行

规则:

1、需要添加默认值的参数直接在参数栏中用等号赋值即可

2、可以所有参数都存在默认值,也可以部分参数设为默认值

3、**只有部分参数有默认值时,带默认值的参数必须放在参数栏末尾**

4、实参和形参的传参是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提

5、**默认参数只需要在声明或定义时说明,不需要两者都说明**

带占位参数的函数

定义:

C++中的函数的参数列表可以有占位参数,用来占位,调用函数时必须填补该位置

规则:

只写类型不写变量名

若无默认值参数,则调用时必须填补

若有默认值参数,则调用时可以不用填补
#include <iostream>

using namespace std;

//show_fun_1是带默认值的参数
//参数c的默认值是100
void show_fun_1(int a, int b, int c = 100);

void show_fun_1(int a, int b, int c)
{
    cout << a << endl << b << endl 
        << c << endl;
}

//show_fun_2是带占位符的函数
//如果没默认值,需要传递第三个参数
//有默认值,不需要传递第三个参数
void show_fun_2(int a, int b, int)
{
    cout << a << endl << b << endl;
}

int main(int argc, char const *argv[])
{
    int data1 = 10, data2 = 20;
    show_fun_1(data1, data2);
    show_fun_2(data1, data2, 300);

    return 0;
}

函数的重载

定义:

在同一作用域内,参数列表不同,函数名相同的函数。

虽然函数名相同,但函数所在内存位置不同,本质上还是不同函数

规则:

1、函数名称必须相同

2、参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)

3、函数的返回类型可以相同也可以不相同

4、仅仅返回类型不同不足以成为函数的重载的依据

原理:

在编译阶段函数会被重新命名,根据函数名、参数列表来决定,比如void Swap(int &a, int &b)在编译阶段的名称为_Swap_int_int

注意事项:

避免与带有默认值的函数进行重载

C++引用

左值:可以取地址的值

右值:不可以取地址的值

int a = 10;
a  ---> 左值
&a ---> 右值

左值的引用

定义:(取别名)

引用变量是一个别名,也就是说,它是某个已存变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量

引用和指针的区别:

1、不存在空引用。引用必须连接到一块合法的内存

2、一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象

3、引用必须在创建时被初始化。指针可以在任何时间被初始化

规则:

<类型>&<引用名> = 目标名

引用必须在创建时被初始化,且初始化后不可以指向其他目标名(**const**)

引用类型必须与目标类型一致

不能将已有的引用名作为其他变量或对象的名字或别名

原理:

使用引用时编译器会在底层生产一个指针,并进行*运算

本质时指针常量的使用**int *const p**
const int * const p = &a;
顶层const --> p
底层const --> *p

用法:

函数传参:

函数返回值:返回的数据不可为局部变量
#include <iostream>

using namespace std;

int &Swap(int &a, int &b)
{
    static int sum = a + b;
    int temp = a;
    a = b;
    b = temp;

    return sum;
}

int main(int argc, const char *argv[])
{
    int a, b;

    cin >> a >> b;
    Swap(a, b);
    cout << "a : " << a << endl
        << "b : " << b << endl;

    int &ret = Swap(a, b);
    cout << "ret : " << ret << endl;

	return 0;
}

对数组引用:
int arr[5] = {1, 2, 3, 4, 5};
int (&refArr)[5] = arr;
refArr[0] = 6;
cout << "arr[0] : " << arr[0] << endl;
对指针引用:
int num = 100;
int *ptr = &num;
int *&refPtr = ptr;

*refPtr = 200;
cout << "num : " << num << endl;

右值引用

定义:

右值引用必须立即进行初始化操作,且只能使用右值进行初始化,当其被初始化过后,在当前作用域内被定义为左值

int a = 3;
int &&b = 3;
b = 100;

函数的重载

定义:

在同一个作用域内,参数列表不用,函数名相同的函数

虽然函数名相同,但函数所在内存位置不同,本质上还是不同函数

规则:

1、函数名必须相同

2、参数列表必须不同(个数不同,类型不同,参数排队不同等)

3、函数的返回类型可以相同也可以不相同

4、仅仅返回类型不同不足以成为函数的重载的依据

原理:

//反编译
g++ -S xx.cpp
在xx.s文件中找 .type

注意点:

避免与带有默认值的函数进行重载

nullptr :替代NULL,能够隐式转换成任何指针或成员指针的类型,也能和他们进行相等或者不等的比较 ---> c++11新特性

NULL存在问题:

 (void *)0  &lt;==&gt; NULL
万能引用既可以接收左值由可以接收右值
左值引用只能接收左值,如果要接收右值必须使用常量左值引用
右值引用只能接收右值

new和delete

是操作符,不需要()

new:申请一个对象

delete:销毁一个对象

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    int *pa = new int(100);
    int *parray = new int [5]{1, 2, 3, 4, 5};
    cout << *pa << endl;
    int *pb = new int (200);
    cout << *pb << endl;
    cout << *pb << endl;
    cout << parray[1] << endl;

    delete pb;
    delete pa;
    pa = NULL;
    pb = NULL;
    delete parray;

    return 0;
}

new delete 和 malloc free区别

1、new/delete的实现是基于malloc/free

2、malloc/free是C/C++标准库函数,new/delete是C++操作符

3、malloc/free需要手动计算类型大小,且返回void*,new/delete可以自己计算类型大小,根据类型返回相应的类型的指针

4、malloc/free只负责分配/释放空间,new/delete会调用构造函数与析构函数,用于初始化对象与销毁对象

5、它们都是动态管理内存的入口,堆是一块具体区域内存,而自由存量区是一个抽象概念

列表初始化(c11新特性)

功能:
主要用于统一初始化语法

初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值替代

顶层const和底层const

顶层const:表示指针本身是一个常量

底层const:表示指针所指的对象是一个常量

<think>首先,用户的问题是:“我想了解C++基本语法有哪些 请问C++基本语法介绍”。这是在询问C++基本语法介绍。 系统级指令要求: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供了几个参考引用: - [1]: 关于标识符命名规则。 - [2]: 关于引用的本质。 - [3]: 关于std命名空间的使用。 - [4]: 关于布尔类型变量大小。 - [5]: 关于传引用时的const使用。 我需要尽可能多地参考这些引用,并在回答中自然地添加引用标识。指令说:“回答中引用的段落末尾自然地添加引用标识”,所以当我在回答中使用特定引用时,需要在段落末尾添加标识。 用户的问题是询问C++基本语法,所以我应该覆盖C++基本语法的各个方面,基于提供的引用: - 从[1]:标识符命名规则。 - 从[2]:引用的概念。 - 从[3]:输入输出和std命名空间。 - 从[4]:布尔类型。 - 从[5]:const引用。 此外,我需要生成相关问题。 回答结构: - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 大纲回答结构: 1. **介绍C++基本语法**:简要介绍什么是C++基本语法。 2. **关键组成部分**: - 标识符命名规则(基于[1])。 - 数据类型:包括布尔类型(基于[4])。 - 变量声明和初始化。 - 运算符。 - 控制结构(如if, for)。 - 函数:包括引用参数(基于[2]和[5])。 - 输入输出:使用cin和cout(基于[3])。 - 命名空间:std的使用(基于[3])。 3. **示例代码**:提供一个简单示例来演示基本语法。 4. **生成相关问题**:在末尾添加相关问题。 确保使用中文回答。 添加引用标识: - 当提到特定规则或概念时,在段落末尾添加引用标识,如[^1]、[^2]等。 示例引用方式: - 例如,当谈到标识符命名规则时,可以说“标识符的命名规则包括必须以字母、下划线或美元符号开头,后续可以是字母、数字等,并且区分大小写[^1]。” 关于数学表达式:C++基本语法中可能没有数学表达式,但如果涉及到,如运算符优先级,可以用行内数学表达式表示。例如,在讨论运算符时,可以说“运算符优先级如$+$比$*$低”,但要确保使用$...$格式。 最终,生成相关问题:类似示例中的“相关问题”,列出3-5个相关的问题。 </think>### C++基本语法介绍 C++是一种面向对象的编程语言,其基本语法提供了构建程序的基础框架,包括变量声明、数据类型、控制结构、函数定义等。我将基于提供的参考引用,逐步介绍核心语法元素,确保内容真实可靠。以下是关键组成部分: #### 1. **标识符命名规则** 在C++中,标识符用于命名变量、函数、类等实体,遵循特定规则以确保代码清晰: - 必须以字母、下划线`_`或美元符号`$`开头(不能以数字开头)。 - 后续字符可以是字母、数字、下划线或美元符号。 - 区分大小写(例如 `variable` 和 `Variable` 被视为不同标识符)。 - 不能是C++关键字(如 `int`, `if`, `else` 等)。 这些规则避免了命名冲突并提升可维护性[^1]。 #### 2. **数据类型** C++支持多种数据类型,包括基础类型和派生类型: - **布尔类型(`bool`)**:表示真/假值,大小为1字节。非值视为 `true`(输出为1),值视为 `false`(输出为0)。例如: ```cpp bool ok = true; // 布尔变量声明 cout << ok << endl; // 输出1 ``` 参考引用显示,即使赋值负值(如 `ok = -199`),输出仍为1,因为非即真[^4]。 - **整数类型(`int`, `char`)**:用于存储整数值和字符。 - **浮点类型(`double`, `float`)**:用于小数。 变量声明时需指定类型,如 `int a;` 或 `char c;`。 #### 3. **输入与输出** C++使用 `cin` 和 `cout` 处理输入输出,需包含 `<iostream>` 头文件并使用 `std` 命名空间: ```cpp #include <iostream> using namespace std; // 使用std命名空间简化代码(练习中推荐) int main() { int a; double b; char c; cin >> a; // 输入整数 cin >> b >> c; // 输入浮点数和字符 cout << a << endl; // 输出整数并换行 cout << b << " " << c << endl; // 输出浮点数和字符 return 0; } ``` 注意:日常练习可用 `using namespace std;`,但项目中建议显式指定(如 `std::cout`)以避免命名冲突[^3]。 #### 4. **引用类型** 引用是变量的别名,本质上是底层指针常量,用于高效传递参数而不复制数据: - **基本语法**:声明时用 `&` 符号,如 `int& ref = a;`。 - **常量引用**:函数参数中推荐使用 `const` 引用(`const int& ref`)保护数据不被修改,避免非成员函数错误[^5]。 - **内部转换**:编译器自动将引用转换为指针操作。例如: ```cpp void func(int& ref) { ref = 100; // 等价于 *ref = 100 } int main() { int a = 10; int& ref = a; // 等价于 int* const ref = &a; ref = 20; // 等价于 *ref = 20; func(a); // 传递引用参数 return 0; } ``` 这提高了效率,尤其在函数调用中[^2]。 #### 5. **控制结构与运算符** - **控制结构**:包括 `if-else`(分支)、`for`/`while`(循环)。例如: ```cpp if (a > 0) { cout << "Positive" << endl; } else { cout << "Non-positive" << endl; } ``` - **运算符**:算术运算符(`+`, `-`, `*`, `/`)、关系运算符(`==`, `!=`)、逻辑运算符(`&&`, `||`)。优先级规则类似数学表达式,例如加法运算符 `$+$` 优先级低于乘法运算符 `$*$`。 #### 6. **函数定义** 函数封装可重用代码,支持参数传递(值传递或引用传递): ```cpp // 使用const引用保护参数 bool isValid(const int& value) { return (value > 0); } int main() { int num = 5; if (isValid(num)) { cout << "Valid" << endl; } return 0; } ``` 非成员函数参数建议加 `const` 以避免意外修改[^5]。 ### 总结 C++基本语法涵盖了命名规则、数据类型、输入输出、引用和控制结构等核心元素。通过结合实用示例和引用内容,这些语法规则确保了代码的健壮性和可读性。如需深入学习,可参考C++标准库文档或相关教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值