从零到壹搞懂C++基础语法


前言

这篇文章是C++从入门到精通的第一篇文章,旨在带领大家入门C++这么优秀的语言,会介绍到C++的发展历程,基础语法,类型,函数,类等。


一、C++ 语言特性

1.C++ 发展历程

C++ 是一种高级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于
多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。以下是各个版本的一些特性。

C++11版本

发行于2011年此时的C++新增了以下特性
	auto关键字
	decltype关键字
	nullptr字面值
	constexpr关键字
	for(declaration : expression)
	Lambda表达式
	initializer_list
	标准库bind函数
	智能指针shared_ptr,unique_ptr
	右值引用&&
	STL容器

C++14版本

发行于2014年此时的C++新增了以下特性
	拓展了lambda表达式,更加泛型:支持auto
	拓展了类型推导至任意函数:C11只支持lambda返回类型的auto
	弃用关键字 [[deprecated]]

C++17版本

发行于2017年此时的C++新增了以下特性
	拓展了constexpr至switch if等:C++11的constexpr函数只能包含一个表达式
	typename 嵌套
	inline 内联变量
	模板参数推导
	元组类 std::tuple:std::pair实现两个元素的组合,它实现多个
	类模板std::variant表示一个类型安全的联合体。
	引用包装器 std::reference_wrapper
	变长参数模板
	结构化绑定(函数多值返回时用{}合成struct)
	非类型模板参数可传入类的静态成员
	在if和switch中可进行初始化
	初始化(如struct)对象时,可用花括号进行对其成员进行赋值
	简化多层命名空间的写法
	lambda表达式可捕获*this的值,但this及其成员为只读
	十六进制的单精度浮点数
	继承与改写构造函数
	当模板参数为非类型时,可用auto自动推导类型
	判断有没有包含某文件__has_include
	[[fallthrough]]用于switch语句块内,表示会执行下一个case或default
	[[nodiscard]]表示函数的返回值没有被接收,在编译时会出现警告。
	[[maybe_unused]]即便没使用也不警告

C++20版本

发行于2020年此时的C++新增了以下特性
	范围库(Ranges Library)
	协程(Coroutines)
	模块(modules)

2.C++ 语言特点

  • C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
  • C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。
  • C++ 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C++。
  • C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
  • C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:封装、抽象、继承、多态
  • C++三个重要组成部分
    • 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
    • C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
    • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

二、基本语法

1.解读一个简单的c++程序

代码如下:

#include <iostream>
using namespace std;
// main() 是程序的执行入口 
int main()
{
   cout << "Hello World";
   return 0;
}

解读:
第一行 C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息。上面这段程序中,包含了头文件 。引入的头文件中包含我们需要的函数或类,本例只引入了标准输入输出流,我们可以使用iostream在终端窗口进行交互。

下一行 using namespace std; 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。有了这个我们使用cin、cout的时候不用在前面加std::了

下一行 // main() 是程序执行入口 是一个单行注释。单行注释以 // 开头,在行末结束。还有一个多行注释/**/可以将内容加进两星号之间。

下一行 int main() 是主函数,程序从这里开始执行。

下一行 cout << “Hello World”; 会在屏幕上显示消息 “Hello World”。

下一行 return 0; 终止 main( )函数,并向调用进程返回值 0。这里返回值可以根据自己的意向进行定制,但要与函数声明的返回值类型保持一致。

2.数据类型

类型整型单浮点型双浮点型布尔型字符型空类型字符串
关键字intfloatdoubleboolcharvoidstring

变量声明代码如下:

# include<iostream>
using namespace std;
int main(){
	int a;
	cin>>a;
	cout<<a;
	return 0;
}

在这里插入图片描述

变量重命名:可以使用typedef对已有的变量进行起别名

typedef type newname; 
eg:
	typedef int shuzi;
	shuzi a;
	a=10;
此时a为int型,数值为10编译语法上完全合法。

C++ 中的左值和右值

左值(lvalue):指向内存位置的表达式被称为左值表达式。
			   左值可以出现在赋值号的左边或右边。
右值(rvalue):术语右值指的是存储在内存中某些地址的数值。
			   右值是不能对其进行赋值的表达式,也就是说,
			   右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

3.变量作用域

在函数或一个代码块内部声明的变量,称为局部变量。
	当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。
	局部变量都有局限性,只能在指定的区域使用,使用完毕后声明周期随着
	局部变动而变动。

在函数参数的定义中声明的变量,称为形式参数。
	只针对函数内部有效。

在所有函数外部声明的变量,称为全局变量。
	全局变量的值在程序的整个生命周期内都是有效的。
	全局变量可以被任何函数访问。也就是说,全局变
	量一旦声明,在整个程序中都是可用的。

局部变量遵循就近原则
	不同区域可以定义同名局部变量,如果某区域属于共有区域并且使用了同名局部变量
	那么哪个变量离其最近,就会使用哪个变量。

4.运算符

运算符----------------描述----------------
+把两个操作数相加
-从第一个操作数中减去第二个操作数
*把两个操作数相乘
/分子除以分母
%取模运算
++自增运算
自减运算
&&称为逻辑与运算符。如果两个操作数都 true,则条件为 true。
||称为逻辑或运算符。如果两个操作数中有任意一个 true,则条件为 true。
!称为逻辑非运算符。用来逆转操作数的逻辑状态,如果条件为 true 则逻辑非运算符将使其为 false。
==检查两个操作数的值是否相等,如果相等则条件为真。
!=检查两个操作数的值是否相等,如果不相等则条件为真
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。

三、数组

1.声明

type arrayName [ arraySize ];
eg:
	double balance[10];

2.初始化

直接初始化

固定数组大小
	double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
随机数组大小【数组大小看值的个数】
	double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
固定数组赋相同初始值
	balance[4] = 50.0;

3.获取数组元素

将数组内的元素通过索引直接赋值给同类型的变量
	double salary = balance[9];

四、字符串

1.声明一个字符串【c风格】

char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
char site[] = "RUNOOB";

2.处理字符串常用的函数

在这里插入图片描述

3.C++中的字符串类

头文件 string
string 字符串名 ="Hello World";
可以直接使用+进行字符串拼接。有一系列成熟的字符串处理方法。

五、分支语句&循环语句

1.分支语句

语句描述
if一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if…else if…else …一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
switch…case …dafault…一个 switch 语句允许测试一个变量等于多个值时的情况
条件? 结果1 : 结果2三目运算符,前面条件满足执行结果1,否则执行结果2

2.循环语句

1.循环类型

循环类型描述
while(){}当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。
for(初始化;终止条件;循环变量的变动){}多次执行一个语句序列,简化管理循环变量的代码。
do{}while()除了它是在循环主体结尾测试条件外,其他与 while 语句类似,只不过比while多执行一次

2.控制条件

控制语句描述
break 语句终止 loop 或 switch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。
continue 语句引起循环跳过主体的剩余部分,立即重新开始测试条件。
goto 语句将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。

六、函数

1.函数的组成部分

一个函数的轮廓

返回值类型 函数名( 参数列表 )
{
   函数主体
}

解释

返回类型:一个函数可以返回一个值。有些函数执行所需的操作而不返回值,
在这种情况下,返回值类型是关键字 void。

函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。

参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值
被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,
也就是说,函数可能不包含参数。

函数主体:函数主体包含一组定义函数执行任务的语句。

2.函数声明、定义

函数声明
	返回值类型 函数名 (参数列表或参数类型);
	当只有一条语句的时候就是函数声明
函数定义
	有函数主体的一个语句块就是函数定义,在使用函数前必须在前面有过定义或声明。

3.函数的嵌套、递归、重载、引用

①函数嵌套

当一个函数调用另一个函数的时候就成称为函数的嵌套。最典型的就是主函数调用其他函数。

#include <iostream>
using namespace std;
 
int sum(int a, int b)
{
 return a+b;
}
 
int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
   result = sum(a, b);
   cout << "Total value is :" << result << endl;
   return 0;
}

警告:各个函数都是占用的栈资源,是相互平行的,不可以进行函数的嵌套定义,只能进行函数的嵌套使用。

②函数递归【斐波那契数列】

函数的递归是一种特殊的函数嵌套,他调用的函数是自身。

#include <iostream>
using namespace std;
int Fib(int n)
{
	if(n == 1 || n == 2)
		return 1;
	else
		return Fib(n-1) + Fib(n-2);
}
int main()
{
	int n;	//n表示为第几个数值
	while(cin >> n)
	{
		int res = Fib(n);
		cout << res <<endl;
	}
	return 0;
}

③函数重载

同函数名,不同参数类型或个数,返回值类型不作为评判标准。

#include <iostream>
using namespace std;

string Sum(string a,string b){
	return a+b;
}
int Sum (int a,int b){
	return a+b;
}

④函数引用

函数引用指的是函数传参的时候传递参数的引用,相当于给原参数起别名。

void Swap (int a,int b){
	int t=a;
	a=b;
	b=t;
}
void Swap (int& a,int& b){
	int t=a;
	a=b;
	b=t;
}

如果使用值传递那么a,b无法成功交换,如果使用引用传递可以将传进去的a,b值互换。


总结

这些仅仅是一些C++的基本语法,面向对象编程请关注本专栏后续博文。如有疑问请在评论区留言。


一心向学 三┏ ( ˘ω˘ )┛ 早睡早起。

在这里插入图片描述

  • 16
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷尔。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值