C++学习(c++17)——1.1 C++基础知识

C++学习(c++17)——1.1 C++基础知识

? 假期花了2个月,连滚带爬地白嫖完C++的一个教学视频(总时长144h),然后开始尝试去运用知识做一些小项目。但实验室的大佬吴学长的魔鬼提问把我又打回原形,然后这次准备拿着资料去踏踏实实学习(把Cpppp放在学校宿舍真是一个错误的决定。) 这次的学习主要围绕的是c++17的一些特性,并且巩固假期里面看视频学习的c++。【学校有小程序大赛,又有老师组织的论文学习的作业,啊啊啊,我想学会分身术】

目录

  • C++学习(c++17)——1.1 C++基础知识

    • 命名空间
    • 字面量
    • 数据类型
    • 枚举类型
    • 条件语句
      • if语句
      • switch语句
    • 函数
      • 函数返回类型的推断(auto)
      • 当前函数的名称(func)
    • 数组
      • C风格的数组【建议改用array和vector】
      • std::array
      • std::vector
    • 结构化绑定(structured bindings)
    • 基于区间的for循环(Range-Based for Loop)
    • 初始化列表

命名空间

C++17允许方便地使用嵌套的命名空间。

c++17前:

namespace MyLibraries{
    namespace NetWorking{
        namespace FTP{
            /*...*/
        }
    }
}

C++17:

namespace MyLibraries::NetWorking::FTP{
    /*...*/
}

//同时可使用名称空间别名:
namespace MyFTP = MyLibraries::NetWorking::FTP;

字面量

数值字面量中可以使用数字分隔符(一个单引号),例如

  • 23‘456‘789
  • 0.123‘456f

C++17中增加了对十六进制浮点字面量的支持,如0x3.ABCp-10、0Xb.cp123(p-10指*2的-10次方)

数据类型

C++17中增加了std::byte来表示单个字节(在c++17之前,用字符或无符号字符来表示一个字节,但那些类型感觉像在处理字符。std::byte则指明意图——内存中的单个字节)

std::byte b{42};

注意

  1. 需要头文件。
  2. std::byte的初始化需要使用单元素列表进行直接列表初始化。

枚举类型

建议用类型安全的enum class强类型枚举来替代类型不安全的enum枚举。

条件语句

if语句

C++17中允许在if语句中包括一个初始化器,语法如下:if (;<conditional_expression>) {}。中引入的变量只在<conditional_expression>和中可用。

switch语句

当一个case表达式后的语句执行完后,如果没有遇到"break",则会继续执行下一个case后的语句,这被称为"fallthrough"。(因为它经常成为bug来源,所以编译器会生成警告信息)

C++17中,可用使用[[fallthrough]]特性,来告诉编译器这是特意为之。

C++17中,switch和if一样支持使用初始化器:switch(;) {}

函数

函数返回类型的推断(auto)

C++14允许要求编译器自动推断出函数的返回类型。要使用这个功能,需要把auto指定为返回类型:

auto addNumber(int number1,int number2){
    return number1 + number2;
}

编译器根据 return后的表达式 推断返回类型。函数中可以有多个return,但是应该解析为同种返回类型。也可以包含递归调用,但是第一个return语句必须是非递归调用(有递归出口)。

当前函数的名称(func)

? 每个函数都有一个预定义的局部变量______func______,其中包含当前函数的名称。这个变量的一个用途是用于日志记录。

数组

C风格的数组【建议改用array和vector】

要获取基于栈的c风格数组的大小(元素个数),可以使用C++17 std::size()函数(需要头文件)。例如

int myArray[3];
unsigned int arraySize = std::size(myArray);

C++17之前获取元素个数:

unsigned int arraySize = sizeof(myArray) / sizeof(myArray[0])//sizeof操作符返回实参的大小(单位为字节)
std::array

std::array是一种大小固定的特殊容器。基本上是对c风格数组进行简单包装。

好处:

  1. 总是知道自身大小。
  2. 不会自动转换为指针,从而避免了某些bug。
  3. 具有迭代器,可以方便地遍历元素。
array<int, 3> arr = {1,2,3}
cout << "Array size:" << arr.size()<<";";
cout << "2nd element:" << arr[1];

上述代码的输出结果为Array size:3;2nd element:2。

std::vector

标准库提供的多个不同的非固定大小容器之一。vector是动态的,可以在运行时添加或者删除元素。

//Create a vector of integers
vector<int> myVector = { 11, 22};

//Add some more integers to the vector using push_back()
myVector.push_back(33);
myVector.push_back(44);

//Access elements
cout << "1st element: "<< myVector[0] << endl;

结构化绑定(structured bindings)

结构化绑定允许使用数组、结构、pair或元组中的元素来初始化多个变量。

例如,假设有下面的数组:

std::array<int, 3> values = {11, 22, 33};

那么可以同时声明三个变量,用这个数组来进行初始化【注意,结构化绑定必须要使用auto关键字】

auto [x, y, z] = values;

绑定的变量个数必须和右侧表达式中值个数一样。

且当所以非静态成员都是公有的情况下,才能将结构化绑定用于结构(struct)。

基于区间的for循环(Range-Based for Loop)

这是除了原本的while、do-while(至少执行一次的循环)、for循环外的第四种。这种循环允许方便地迭代容器中的元素。可用于C风格的数组、初始化列表,也可以用于具有返回迭代器的begin()和end()函数的类型,如std::array,std::vector等标准库容器。

std::array<int, 4> arr = {1, 2, 3, 4};
for(int i : arr){
	std::cout << i << std::endl;
}

(若想迭代元素时不制作副本,则应使用引用变量)

初始化列表

在头文件<initializer_list>头文件中定义。利用初始化列表,可以用于可变数量参数的函数。

#include <initializer_list>

using namespace std;

int makeSum(initializer_list<int> 1st){
    int total = 0;
    for(int value : 1st){
        total += value;
    }
    return total;
}

初始化列表是类型安全的。

原文地址:https://www.cnblogs.com/ranbom/p/12643900.html

时间: 2024-10-09 19:18:13

C++学习(c++17)——1.1 C++基础知识的相关文章

APUE学习笔记:第一章 UNUX基础知识

1.2 UNIX体系结构 从严格意义上,可将操作系统定义为一种软件(内核),它控制计算机硬件资源,提供程序运行环境.内核的接口被称为系统调用.公用函数库构建在系统调用接口之上,应用软件即可使用公用函数库,也可使用系统调用.shell是一种特殊的应用程序,它为运行其他应用程序提供了一个接口 从广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并给予计算机以独有的特性(软件包括系统实用程序,应用软件,shell以及公用函数库等) 1.3  shell shell是一个命令行解

Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识

JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 HTML 形式返回, Java 程序运行在服务端,最终显示在客户端.JSP 源于 Java,因而 JSP 的运行环境依赖JDK,当然也需要服务器软件(例如 Tomcat 等). 一.运行环境搭建 1.安装 JDK,请参阅之前的博文:Java学习-001-JDK安装配置 2.Tomcat部署及环境变

oracle学习入门系列之二 数据库基础知识

oracle学习入门系列之二 数据库基础知识 本篇蛤蟆要梳理下那些被淡忘的数据库基础知识,也许根本就没被人记住过.不管是哪种情况,该记住的必须记住,记不住就把他记下来吧. 首先问几个问题如下: 数据库基础知识是什么? 好吧,蛤蟆直接吐后而不亡,看目录开始吧. 本人邮箱:[email protected] 微信公众号:HopToad 欢迎各界交流 1      基本概念 概念就是概念,大伙对这些名词不要死磕,但是对定义一定要理解,理解方能领悟,领悟方能运用自如后创新. 1.1      数据 数据

学习Spring必学的Java基础知识(2)----动态代理

学习Spring必学的Java基础知识(2)----动态代理 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www

总结了零基础学习Java编程语言的几个基础知识要点

很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这些Java的基本概念也是必不可少的,死记硬背肯定是不行的,重在理解,理解它们之间的区别与联系,分别有哪些应用.想想这些代码中用到了哪些知识点.不要一味地照着书本敲代码.而不去理解. 1.Java编程语言,即语法. 2.Java文件格式,即各种文件夹.文件的后缀. 3.Java虚拟机(JVM),即处理

&lt;&lt;Python基础教程&gt;&gt;学习笔记之|第01章|基础知识

本学习笔记主要用要记录下学习<<Python基础教程>>过程中的一些Key Point,或自己没怎么搞明白的内容,可能有点杂乱,但比较实用,查找起来也方便. 第01章:基础知识 ------ Jython:      Python的Java实现,运行在JVM中,相对稳定,但落后于Python,当前版本2.5,在TA(Python+Robot)会用到 IronPython:  Python的C#实现,运行在Common Language Runtime,速度比Python要快 >

学习Spring必学的Java基础知识(7)----事务基础知识

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

主题:学习Spring必学的Java基础知识(8)----国际化信息

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.):[1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081[2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/112329

学习编程语言应该掌握哪些计算机基础知识?

随着软件开发技术的不断发展,编程语言的使用也越来越方便,总的来说编程语言并不难学,即使没有任何计算机基础,也可以通过一个系统的学习过程来掌握编程语言. 目前经常使用的编程语言有几十种,包括Java.C.Python.C++.PHP.C#.JavaScript.R.Scala等,这些编程语言往往都有自己特定的使用场景,在难易程度上也有一定的区别.通常情况下,Java可以用于Web开发.大数据开发.Android开发等,C语言可以用于操作系统开发.嵌入式开发等,Python可以用于Web开发.大数据