5.9k 词
隐式对象形参在正式介绍显式对象形参之前,让我们先来复习一下什么叫隐式对象形参。我们知道,在调用类的非静态成员函数时,必须通过对象的成员访问运算符来调用。而在函数内,我们可以通过this指针来访问这个调用成员函数时的对象。 123456789101112131415#include <cstdio>struct A { void foo() { printf("Call A::foo() from %p\n", this); }};int main() { A a, b; printf("address of a: %p\n", &a); a.foo(); printf("address of b: %p\n", &b); b.foo();} 这一特性背后的机制就是隐式对象形参。在重载决议的过程中,编译器会在成员函数的形参列表最前面加上一个额外的形参。同时,将本次调用所...
1.9k 词
简写函数模板是C++20引入的一个新特性,是一个非常实用的语法糖。 在简写之前,自然是有完整语法的,让我们先来复习一下声明函数模板的完整语法: 1234template<class T1, class T2>void func(T1 arg1, T2 arg2) { /*function body*/} 要声明一个函数模板,首先是template关键字,后随一对尖括号括起来的模板形参列表。接下来的部分就和普通的函数声明语法一样了,并且模板形参列表中引入的名字,可以作为类型名用在函数声明中。 用模板形参来模板化函数形参是最常见的函数模板用法。并且,由于模板实参推导的存在,在使用这些函数模板时,不必显式的写出模板实参。 123// 推导出 T1 = int,T2 = double// 实例化并且调用func<int, double>(0, 0.0)func(0, 0.0); 模板实参推导是使用函数模板时的便利特性,为了简化函数模板的声明,C++20引入了简写函数模板的语法: 1234// 虽然看起来是个函数声明,但这实际上是...
4.6k 词
了解一座城市最好的办法就是走进其中;学习一门编程语言最好的方式就是亲自动手编码。 一、第一个C++程序今天,我们就来走近C++,当然,不是深入其中的细节,而是从空中俯瞰,观察它大致的形状。下面的内容会引入很多概念,但是不必担心,不理解是很正常的,在后续的学习过程中你会慢慢掌握它们的。 下面我们就来看看一段经典的入门代码,这段代码的功能非常简单,它输出一行文字“你好,我是C++。”然后退出: 1234567#include <iostream>// Say hello to C++int main(){ std::cout << "你好,我是C++。\n"; return 0;} 这虽然是一个很小的程序,但它已经具备了一个C++程序所必须的很多构造了。看到第一行: 1#include <iostream> 在C++中,以井号#开头,并且单独占一行的语言构造称为预处理指令(Preproccessor Directive)。在正式开始编译之前,预处理器会识别这些指令,并且对源代码进行预处理。就像...
5.2k 词
大家好欢迎来到我的C++教程。C++是我一直以来非常喜欢的一门编程语言,我也希望它被更多人了解,因此萌生了制作一份C++教程的想法。和很多人一样,我是在大学阶段接触到C++的。现在工作五年多,C++也一直是我的主力编程语言。我也算是对C++有一些经验,但同时也深知C++的复杂。没有人敢说自己精通C++,我的教程也难免出现疏漏错误。欢迎大家来和我交流讨论,本站的关于页面可以找到我的联系方式,也可以直接在下方的评论区留言。 一、什么是程序现代社会已经离不开各种各样的程序了。你手机里的APP,电脑上的游戏,都是程序。简单来说,程序就是一系列指令,计算机可以识别并执行这些指令完成相应的动作。而程序员的工作就是将解决问题的方案描述为计算机可以识别的形式,这就是程序设计。程序设计过程中最有力的工具自然就是编程语言,而C++自其诞生以来,就一直是最受瞩目的编程语言之一。 二、什么是C++C++是一门通用编程语言,通用意味着它能胜任各种角色,计算机领域的每一个角落都能找到C++的影子。但总体上,C++更偏向于系统编程,那些既要求高性能,又需要高级特性支持的领域正是C++大显身手的地方——例如操作...
14k 词
结构化绑定是C++17新增的语法,适当使用能极大地提升编程体验。结构化绑定将引入的标识符绑定到对象的元素或成员上。很多人将结构化绑定视为引用的语法糖,诚然它们有许多相似之处,但二者在语义上还是有很多不同的地方。 1. 绑定到数组的元素首先,结构化绑定能够绑定到数组的元素上: 123int arr[3] = { 1,2,3 };auto [a, b, c] = arr;printf("%d %d %d\n", a, b, c); 在这段代码中,定义了a b c三个结构化绑定。通过printf可以观察到它们的值分别是1 2 3,对应数组arr的三个元素。 实际上在这个过程中编译器帮我们干了下面的事:首先,引入一个匿名变量,在这里我们叫它_unnamed_,它的各个元素从arr复制初始化。然后,将结构化绑定引入的三个名字分别绑定到这个匿名数组的三个元素上。 12345int arr[3] = { 1,2,3 };int _unnamed_[3] = { arr[0], arr[1], arr[2] }...
8.6k 词
if (strcmp(language, "C")) 完整语法 if语句是C/C++中非常常见的语句,它的效果是根据条件选择其中一个分支执行。我们先来复习一下C语言中的if语句的完整语法: if (条件表达式)真-分支语句if (条件表达式)真-分支语句else假-分支语句 条件与分支 在C语言中,if括号内的条件必须是一个标量类型的表达式。标量类型包括以下类型: 字符类型 char signed char unsigned char 整数类型 short int long long long以及它们对应无符号版本 枚举类型 enum 浮点类型 float double long double以及它们对应的复数和虚数版本 指针类型 简而言之,只要表达式的类型能够与0进行相等性比较即可:当表达式的结果不等于0,就执行真-分支语句;否则,若存在假-分支语句,就执行假-分支语句。 1234if (expr) // 等价于 if (expr != 0) true_branchelse false_branch if的两个分支...
119 词
大家好,欢迎来到Juvwxyz的个人博客。 QQ频道:std::forward编程社区 点此加频 GitHub:https://github.com/Juvwxyz B站主页:Juvwxyz的个人空间 LoveLive群:641470288 点此加群