C++编程中的核心知识点!

点击蓝字

a38a417dcace8297d1d2b0b8074f032d.png

关注我们

来源于网络,侵删

尊重函数接口,尽量不作内部改动


C++代码语句
分为:内置类型,名字,变量,操作符,标量,字符串,预处理指示(如#include)等

C++中定义类来组织数据结构

标准库的头文件用尖括号 < > 括起来,非标准库的头文件用双引号 ” ” 括起来。

对象是内存中具有类型的区域。

在C++中,初始化和赋值是两种不同的操作。

内置类型变量在任何函数外如不初始化,系统都会初始化为0,在函数体内如不初始化则可能发生错误(除了用作左操作数)。

有些类类型有默认构造函数,因此定义其对象时可以不显式地提供初始化。

在 C++ 语言中,变量必须且仅能定义一次,而且在使用变量之前必须定义或声明变量,声明变量不分配内存,因此声名不初始化,若声明同时初始化则视为定义。

extern关键字用于声明。全局域定义的非 const 变量默认为 extern。要使 const 变量能够在其他的文件中访问,必须地指定它为 extern。

要理解的重要概念是引用只是对象的另一名字,初始化是指明引用指向哪个对象的唯一方法。比如int val = 1024;int &refval = val;//refval是val的引用,当int I = refval;相当于int I = val;引用是一种复合类型

enum是枚举关键字enum Points{point2d,point2w,point3d,point3w};表示花括号内成员默认为0,1,2,3都是const变量,用来初始化枚举成员的值必须是一个常量表达式,但枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。Points是一个枚举类型。

C++ 中,通过定义来自定义数据类型。类定义了该类型的对象包含的数据和该类型的对象可以执行的操作。接口(interface)和实现(implement)。

定义变量和定义数据成员存在非常重要的区别,类中定义的变量称为数据成员,当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数的特殊成员函数控制初始化。

C++中也可以使用struct关键字来定义类,它与class的区别在于类中第一个访问标号前的成员默认为public,而class默认为private。注意private只是对于类外语句调用权限而言,在类内部成员函数可以随意调用private成员。

头文件用于声明而不是定义,因为定义只可以出现一次,而头文件在多个源文件中出现,所以只用于声明。对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数。头文件中含有支持分别编译所需的类定义及变量和函数的声明。

C++预处理器是在编译之前运行带有预处理标志#的程序,如#include指示允许两种形式<>和“”,前者表示标准库头文件,后者表示自定义头文件。#define预处理器变量,通常全部大写字母。可以用:

#ifndef SALESITEM_H#define SALESITEM_H
// Definition of Sales_itemclass and related functions goes here
#endif1234

首先第一句判断SALESITEM_H是否定义,若没有则第二句定义该预处理器变量,直到#endif结束。若第一句判断出SALESITEM_H已经定义,则忽略后面的内容。此预处理命令可以用于避免头文件在被程序多次包含时内部定义的类被反复定义,引起编译错误。

String类型的输入操作符<<:忽略开头的空白符(空格,制表符,换行符等),读到该字符串第一次出现空白符终止。字符串字面值包含一个额外的空字符用于结束字符串,所以“string”包含7个字符。

先初略地了解一下vector和iterator的概念,以后用到时深入学习,vector容器是一种类型,vector ivec表示保存int对象的类模板。Iterator也是一个类,vector::iterator iter;表示由vector定义的迭代器类型对象iter,用于遍历容器中的元素。使用它们之前必须在文件头包含并using声明。

C++ primer第三章介绍了几个常用的标准库类:vector,string,iterator和bitset。


C++ 语言提供了两种类似于 vector 和迭代器类型的低级复合类型——数组和指针。现代 C++ 程序应尽量使用 vector 和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。

数组
定义的类型名可以是任意内置数据类型或类类型,数组元素可以是除了引用之外的任意复合类型。数组的维数必须用值大于等于1的常量表达式定义。此常量表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型 const 对象。非 const 变量以及要到运行阶段才知道其值的 const 变量都不能用于定义数组的维数。

与vector不同,数组不允许用另一个数组赋值和初始化,数组一经定义就不允许再添加新元素。


指针
的定义:int *p;从右往左读,定义p为一个指向int类型对象的指针变量。一个有效的指针必然是以下三种状态之一:保存一个对象的地址;指向某个对象后面的另一个对象;0值。避免使用未初始化的指针。


指针的算术操作:加减整型数值。与迭代器的算术操作实现方式相同。对指针解引用,可得到它所指向的对象的值:*p。在表达式中使用数组名时,实际上是使用了指向该数组第一个元素的指针,注意数组名与指针变量的等价性。

C++ 允许计算数组或对象的超出末端的地址,但不允许对此地址进行解引用操作。如:

const size_t arr_size = 5;
int arr[arr_size] = {0,1,2,3,4};
int *p = arr;
int *p2 = p + arr_size;1234

p2保存的是数组arr_size超出末尾的地址。


指向const的指针
理解为:“自以为指向const的指针”,当一个指针定义时指向const对象,它就会认为自己是一直指向const对象的指针,即使它后来指向一个非const对象,也不能通过引用修改该对象的值。但可以通过重新定义一个指向该对象的指针修改值。在实际的程序中,指向 const 的指针常用作函数的形参。

另外还有const指针,比如int *const p = &val;const指针若指向const对象,则限制一切改动的行为。


位操作符
<<和>>分别代表二进制数各位整体左移或右移右操作数位数。如int 12>>1;表示1100变为0110(6)。赋值操作返回左值,具有右结合性。


j = i++与j = ++i的区别,前者自增操作符返回初值,后者返回自增后的值。尽量使用前置自增。

C++语言为包含点操作符和解引用操作符的表达式提供了一个同义词:->箭头操作符。比如:sales_item *sp = &item1; (*sp).same_isbn(item2);等效于sp->same_isbn(item2);


运用newdelete语句创建和撤销动态内存,即可创建和释放动态数组也可创建和释放单个对象,如:int *pi = new int; 表示在自由存储区(堆)分配了一个整型对象,并返回该对象的地址,并用该地址初始化指针pi。

又如:int *pi = new int(20); 同时初始化该整型对象为20。string *ps = new string; string的默认构造函数将其初始化为一个空字符串。若要显式初始化非默认初始化的对象,可写为:int *pi = new int();在类型名后面加圆括号表示初始化为空值,这样做可以避免因未初始化带来的错误。

delete pi; 表示释放pi所指向内存,但pi中保存的地址仍存在,此时pi成为悬垂指针,易发生错误,应立即将pi置0,以显示它未指向任何对象。使用delete删除非自由存储区的内存是不合法的。

对于const对象,须返回const对象地址,比如:const int *pi = new const int(1024);


C风格字符串
是一个const char型字符数组:const char *ps = “C style”; 以空字符为结束位;C++标准库用string类型重新定义了字符串,更加简单直观:string ps(“characters string”);

尽量使用string类来定义字符串。


C++编译器在隐式类型转换时会尽可能防止精度损失。强制类型转换的一般格式为:cast-name(expression) 。

其中cast-name是要强制转换的方式,如static_cast;const_cast 等,type是欲转换为的类型。尽量避免使用强制类型转换。


switch
语句每个case后要加break,否则程序只会跳过后续的case标号继续执行case标号内的内容。若要在case中定义变量,则使用花括号限定变量的使用范围。


C++异常处理关键字:throw和try{}catch{}catch{}…;了解一下,throw用于退出代码块,转向异常处理。try一段代码,catch其中的语句,作相应处理。标准库定义的异常处理类都在stdexcept头文件中。


函数形参使用引用修改实参的值安全而方便,尽量不使用指针。

函数中如不需要修改实参的值,则统一使用const形参引用,如:下列程序在s中查找c字符:

string::size_type find_char(string &s,char c){string::size_type i = 0;while(i != s.size() && s(i) != c )
++i;return i;
}123456

若调用此函数find_char(“string”,’s’); 则出现编译错误,字符串和字符字面值是右值,可以通过const string &s 引用,此处字面值常量先隐式转化为一个临时const对象再初始化const string &s。


区分int *matrix[10 ]; 和int (*matrix) [10];前者表示包含10个指针的指针数组,后者表示指向含有10个int型元素的数组的指针。数组下标优先级大于指针操作符。

int main(int argc, char *argv[]) 中,argv是一个c风格的字符串数组,char *argv[]相当于char **argv,argc保存argv的字符串个数。


左值可出现在赋值语句的右侧或左侧,而右值只能出现在赋值号的右侧。函数返回值用于初始化在调用函数处建立的临时对象。因此,函数可返回引用作为左值:const string &shorterString(const string &s1,const string &s2),形参和返回类型都是引用。但不要返回局部对象的引用,同样,可以返回指针,但不能返回局部对象的指针,否则会成为悬垂指针。


递归函数
是直接或间接调用自身的函数,必须要有中止条件,否则会无限循环。如:定义一个递归函数求取1×2×3……100的值:

int f(int val){if (val > 1) return f (val-1)*val;return val;
}1234

函数声明可省略形参名,一般在声明阶段提供默认实参:string screenInit(string::size_type width = 80, string::size_type height = 20, char background = ‘c’); 当调用函数时,初始化值会从左向右覆盖默认实参值,因此应将最有可能变更的默认实参放在最左边。函数声明一般整理放在头文件中,在源文件中包含头文件。


函数中,每个名字都有作用域,每个对象都有生命期,形参和局部变量的生命期在函数调用过程中,它们的名字作用域限于函数块中从定义到快结束之间。若我们希望一个局部对象在函数调用结束后仍然具有生命,则可以定义静态局部变量static关键字。

定义inline内联函数是为了编译器在处理函数时按照函数块内语句展开,节省直接处理函数带来的花销。在普通函数前加inline关键字,并只能在头文件中定义。


类的成员函数在类内声明,可以在类外定义,也可以在类内定义。其形参表包含一个隐式形参this指针,初始化为调用该成员函数的对象地址,如:在Sales_item类中定义的成员函数:

bool same_isbn(const Sales_item &rhs) const {return isbn == rhs.isbn;
}123

在调用total.same_isbn(trans)时,花括号前的const表明隐式指针this是一个指向total对象的const Sales_item* 类型的指针,该函数称为常量成员函数。return isbn == rhs.isbn相当于:

return this->isbn == rhs.isbn; 函数体中可以显式地使用后者语句,但没有必要。

构造函数是一种特殊的成员函数,用于初始化类,同名构造函数可以重载,由不同数目或类型的形参表区分。构造函数没有返回类型,和类同名。

通常,我们将类放在与类同名的头文件中定义,而成员函数放在与类同名的源文件中定义。


每个版本的重载函数应在同一个作用域中声明,局部同名函数会覆盖全局函数而不是重载。

f5f82a4261470dbee13b27e201f324f9.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

d7f7b8087a43577e51a77a16a0531a6e.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3.70_Python3 基本数据类型

Python3 基本数据类型Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。在 Python 中&#xff0c;变量就是变量&#xff0c;它没有类型&#xff0c;我们所说的"类型"是变量所指的内存中对象的类型。等号()用来给变量…

jdbc mysql驱动_MySQL JDBC驱动程序如何处理准备好的语句

jdbc mysql驱动准备的语句类型 在研究《 高性能Java持久性》一书中的“ 语句缓存”一章时&#xff0c;我有机会比较了Oracle&#xff0c;SQL Server&#xff0c;PostgreSQL和MySQL处理预准备语句的方式。 感谢Jess Balint &#xff08;MySQL JDBC驱动程序撰稿人&#xff09;在…

C++ 语言的单元测试与代码覆盖率

点击蓝字关注我们来源于网络&#xff0c;侵删前言测试是软件开发过程中一个必须的环节&#xff0c;测试确保软件的质量符合预期。对于工程师自己来说&#xff0c;单元测试也是提升自信心的一种方式。直接交付没有经过测试的代码是不太好的&#xff0c;因为这很可能会浪费整个团…

使用Spring AOP和番石榴速率限制器的节气门方法

外部服务或API可能有使用限制&#xff0c;或者它们不能失败就无法处理大量请求。 这篇文章解释了如何创建一个基于Spring Framework的方面&#xff0c;该方面可以用来限制使用Guava速率限制器的任何建议方法调用。 以下实现需要Java 8&#xff0c;Spring AOP和Guava。 让我们从…

C++ 模板(Template)总结,长点小知识

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删前言&#xff1a;大家好&#xff0c;今天给大家分享一篇关于 C 模板总结概述.模板&#xff08;Template&#xff09;指 C 程序设计设计语言中采用…

归并排序 java_归并排序(Java实现)

package primary_01;/** 归并排序* 1.算法实现* 2.验证算法的正确性* 3.分析算法的复杂度*/public class Merge_sort {public static void main(String[] args) {int arr [] {2,1,6,5,9,8,2020,199};sort(arr, 0, arr.length-1);for (int i : arr) {System.out.print(i" &…

python kotlin_在Python,Java和Kotlin中标记参数和重载

python kotlin在多种语言之间跳来跳去可以帮助您注意到不同语言的习惯用法和最佳做法之间的某些差异。 比较有趣的差异之一与一个函数执行多项操作有关。 Python 我们先来看一下Python。 Python实际上无法重载&#xff0c;因为用相同的名称定义一个新的函数/方法只会覆盖前一个…

python调用zabbixapi接口_python调用zabbix api获取主机信息

import requestsimport jsonheaders {Content-Type: application/json}class GetZabbix:def __init__(self):#用户信息self.username "****"self.password "****"self.url "http://192.168.0.*/zabbix/api_jsonrpc.php"self.token self.get…

C++17 常用新特性:带初始化的 if 和 switch 语句

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删早在2016-03-14&#xff0c;Thomas Kppe 在https://wg21.link/p0305r0中就提出了在if和switch使用初始化语句&#xff0c;使用时的代码示例如下&…

python回归预测例子_案例实战 | 逻辑回归实现客户流失预测(附Python代码与源数据)...

关注一下~&#xff0c;更多商业数据分析案例等你来撩前言利用逻辑回归进行客户流失预警建模中涵盖了许多比较细的知识点&#xff0c;思维导图只展示了极小的一部分&#xff0c;相关知识点链接将穿插在文中。(源数据源代码空降文末获取)数据读入数据属性说明数据探索简洁版本&am…

latex中算法命令_比较Java 8中的命令式和功能性算法

latex中算法命令Mario Fusco受欢迎的推文令人印象深刻&#xff0c;显示了类似算法的命令性和功能性方法之间的主要区别实际上是&#xff1a; 势在必行–功能分离pic.twitter.com/G2cC6iBkDJ — Mario Fusco&#xff08;mariofusco&#xff09; 2015年3月1日 两种算法都做同样…

四大语言加强统治地位,Rust威胁C/C++

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删TIOBE 公布了 2022 年 10 月的编程语言排行榜。截至今日&#xff0c;Python、Java、C 和 C 语言已经在 TIOBE 榜单的前 4 位盘踞了相当长的一段时…

sql计算留存_SQL无所不能:DBA宝妈宝爸系列分享

原文链接&#xff1a;https://www.modb.pro/db/22315 目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿)需求&#xff0c;具体可参考&#xff1a;使用SQL计算宝宝每次吃奶的时间间隔 - Part1&#xff1a;分析函数的使用使用SQL计算宝宝每次吃奶的时间间隔 -…

java8流分组 性能_Java性能教程– Java 8流有多快?

java8流分组 性能在此JAX Magazine的预览预览中&#xff0c;JAX伦敦发言人Angelika Langer为使用Java流的任何人回答了最重要的问题&#xff1a;它们真的更快吗&#xff1f; Java 8是JDK收集框架的主要补充&#xff0c;即流​​API。 与集合相似&#xff0c;流表示元素序列。 …

对 int 变量赋值的操作是原子的吗?为什么?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删这个是在面试的时候遇到的问题&#xff0c;当时没有答出来。回到家以后查了查&#xff0c;整理记录下来。原问题&#xff1a;什么指令集支持原子…

C语言知识总结:if-else判断语句和switch-case选择语句

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、if-else判断语句一个基本的if语句由一个关键字if开头&#xff0c;跟上在括号&#xff08;&#xff09;里边的是表示逻辑条件的表达式&#xf…

hibernate性能_改善Hibernate应用程序性能的7种方法

hibernate性能Hibernate是将Java Web应用程序与SQL数据库集成的好工具&#xff0c;但是当应用程序的响应时间开始显着增加时&#xff0c;我们应该怎么做&#xff1f; 当我们怀疑应用程序是否会随着客户群的增长而扩展时&#xff0c;我们该怎么办&#xff1f; 在花大价钱托管或…

python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度

python学习笔记--坐标轴刻度所用的库及环境:ide:pycharmpython环境&#xff1a;python3.7matplotlib: matplotlib 1.11numpy&#xff1a; numpy1.15.datetime &#xff1a;datetime坐标轴刻度概念当需要把x&#xff0c;y坐标轴刻度调整的更密集些或者更宽松点学习如何调整x&…

为什么永远不会有语言取代C/C++?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删数以百计的 C/C 替代品将会出现&#xff0c;但 C/C 将永远与我们同在&#xff01;每个 CPU 都带有一种称为 ISA&#xff08;指令集架构&#xff…

mwc校准油门_编写下载服务器。 第五部分:油门下载速度

mwc校准油门在僵尸网络时代&#xff0c;您可以租用几百美元来运行自己的分布式拒绝服务攻击&#xff0c;拥有紧急开关来有选择地关闭昂贵的功能或严重降低性能是一个巨大的胜利。 在缓解问题的同时&#xff0c;您的应用程序仍可运行。 当然&#xff0c;这种安全措施在高峰或工作…