技术栈
语法基础
无名猿
12 天前
c++
·
性能优化
·
内存管理
·
现代c++
·
语法基础
移动构造与移动赋值:把资源偷过来
「std::move 是什么」那一篇已经讲清楚了:它只是个类型转换,真正搬数据的是移动构造函数。这一篇换个视角,从类的实现者出发,亲手写出正确、高效的移动操作。有几个问题只有写实现时才碰得到:noexcept 为什么不是装饰、移动后源对象到底处于什么状态、移动赋值怎么处理自赋值。还有一个更隐蔽的:编译器可能压根没给你生成移动操作。
无名猿
12 天前
c++
·
现代c++
·
语法基础
成员初始化列表与初始化顺序陷阱:按声明顺序,不是书写顺序
a_(b_), b_(x) 这种初始化列表,在评审里特别容易被放过去:两行都写对了成员名、都写对了实参,编译器也不一定报错。但如果 b_ 的声明在 a_ 后面,那 a_(b_) 读的就是一个还没初始化的 b_。这不是「值不对」,是未定义行为(undefined behavior)。这篇把成员初始化列表的规则、顺序陷阱和性能差异一次讲清,结尾给一条可以直接照抄的纪律。
无名猿
13 天前
c++
·
内存管理
·
现代c++
·
语法基础
裸指针还能不能用:不拥有与拥有的边界
「裸指针还能不能用?」网上一边倒的答案是「别用,全换成 std::unique_ptr」。这话对,但只对了一半。C++ Core Guidelines 的真正立场更精细:裸指针(a T*)本身没有错,错的是用它去表达「所有权」。指针可以放心地当「观察者」用,只要你约定它不负责释放。这篇把「不拥有」和「拥有」的边界划清楚,并给你能直接套用的签名写法。
无名猿
13 天前
c++
·
内存管理
·
现代c++
·
语法基础
左值、右值、纯右值、将亡值:值类别入门
你有没有写过 std::move(x) 之后发现它还能被读取,或者重载了 f(T&) 和 f(T&&) 却搞不清到底调了哪个?这些怪现象的根都在「值类别(value category)」上。C++11 起给每个表达式贴了一张隐形标签,它直接决定一个表达式能不能取地址、能不能被移动、以及重载决议时该选哪个版本。这篇把五个概念一次讲清,并用真跑出来的输出告诉你每种实参选中了哪个函数。
无名猿
13 天前
c++
·
内存管理
·
标准库
·
语法基础
指针算术与数组退化:数组名到底是不是指针
「数组名就是指针」是 C/C++ 初学者最早听到的半句真理。说它是半句,是因为前半句在多数场合成立,后半句就会咬人:数组名在大多数表达式里会退化(decay)成指向首元素的指针,但数组类型本身和指针类型不是一回事。sizeof(arr) 拿到的是整块数组的字节数,&arr 的类型是「指向含 N 个 int 的数组的指针」。下面用编译器和 static_assert 把这件事钉死,顺便解释为什么函数参数里 int arr[10] 其实等价于 int*。
无名猿
14 天前
c++
·
现代c++
·
语法基础
构造函数详解:默认、委托、转换与 explicit 到底写在哪
std::vector<int> v{10} 和 std::vector<int> v(10) 编译都不报错,可前者得到「一个元素,值是 10」,后者得到「10 个元素,全是 0」。同一个类、同样的参数,只换了括号,语义就完全变了。
无名猿
17 天前
c++
·
现代c++
·
语法基础
·
踩坑记录
C++ lambda 捕获列表详解:值捕获、引用捕获、初始化捕获与悬垂引用
捕获列表是整个 lambda 里唯一「没有默认值可选」的部分:你必须明确写出 []、[x]、[&x] 还是 [=]。它决定了三件事 —— 闭包能不能活过被捕获变量的生命周期、闭包对象占多少字节、以及调用时看到的是「定义那一刻的快照」还是「变量的实时值」。这三件事全是踩坑高发区,本文用真跑的输出把它们一个个钉死。
无名猿
17 天前
c++
·
标准库
·
现代c++
·
语法基础
std::optional 完全指南:别再用 -1 和 nullptr 表达「没有值」
用 -1 表示「没找到」、用 nullptr 表示「没配置」,这类约定在 C++ 里活了几十年,代价是每个调用方都得记住「-1 是特殊值」并且每次都记得判断。C++17 的 std::optional<T> 把这件事变成类型系统的一部分:函数的返回值类型直接写着「可能没有值」,编译器会逼着调用方处理空的情况。它不涉及堆分配、不引入间接跳转,值就躺在对象内部。
无名猿
17 天前
c++
·
现代c++
·
语法基础
·
踩坑记录
nullptr 取代 NULL 和 0:空指针的三种写法和唯一正确解
0 是整数,NULL 在多数实现里也只是 0 的宏,而 nullptr 是 C++11 引入的、专门表示空指针的独立类型 std::nullptr_t。这一个差别,在函数重载和模板推导里能悄无声息地选错版本。这篇用 static_assert + std::is_same 把三种写法的真实类型钉出来,并说清那个经典陷阱 f(NULL)。
无名猿
18 天前
c++
·
标准库
·
语法基础
·
踩坑记录
size_t 与 int 混用陷阱:有符号无符号比较与整数提升
size_t 和 int 混在一起比较大小,是 C++ 里最容易被忽略、又最容易出线上 bug 的坑。先看一个反直觉的事实:-1 > 0u 在 C++ 里的结果是 true。它不是语言 bug,而是「有符号数与无符号数比较时,有符号数会被转成无符号数」这条规则的直接后果。本文用真实编译输出把这条规则讲透,并整理成可查的规则表,最后给出几种规避写法及其取舍。
无名猿
19 天前
c++
·
现代c++
·
模板元编程
·
语法基础
左值引用、右值引用与万能引用:引用折叠全解
你大概见过 std::vector::push_back(T&&) 既能接左值又能接右值,也见过 std::forward 能把参数「原样」转发出去。它们背后是同一套机制:引用有三种(左值引用、右值引用、万能引用),而编译器用「引用折叠(reference collapsing)」把多层 &/&& 压成最终的一种。这篇把这套规则拆开,并用真跑的输出证明「具名右值引用其实是左值」这个反直觉结论。
无名猿
19 天前
c++
·
内存管理
·
现代c++
·
语法基础
对象存储期全解:automatic / static / dynamic / thread
「这个变量什么时候被销毁?」答案不取决于它在哪一行写的,而取决于它的存储期(storage duration)。C++ 里有四种存储期:自动(automatic)、静态(static)、动态(dynamic)、线程(thread_local)。它们常和作用域(scope)被混为一谈——但作用域只决定「名字在哪段代码里看得见」,存储期才决定「对象活到什么时候」。本文用构造/析构的真实输出把四种存储期钉死。
_OP_CHEN
8 个月前
开发语言
·
前端
·
javascript
·
界面开发
·
前端开发
·
网页开发
·
语法基础
【前端开发之JavaScript】(四)JS基础语法下篇:函数与对象核心要点深度解析
前言一、函数:JS 的 “代码积木”1.1 函数的基本定义与调用1.2 函数的参数特性:灵活的 “传参规则”
_OP_CHEN
8 个月前
开发语言
·
前端
·
javascript
·
网页开发
·
图形化界面
·
语法基础
·
gui开发
【前端开发之JavaScript】(三)JS基础语法中篇:运算符 / 条件 / 循环 / 数组一网打尽
前言一、运算符:JS 程序的 “计算引擎”1.1 算术运算符1.2 赋值与复合赋值运算符1.3 自增自减运算符
Nelson_hehe
1 年前
java
·
语法基础
·
面向对象程序设计
Java基础第四章、面向对象
继承-重写子类使用super关键字指明调用父类的某个方法或者成员变量(这个方法在子类中被重写了)super关键字应用:
我是哈哈hh
2 年前
前端
·
javascript
·
vue.js
·
前端框架
·
vue
·
语法基础
【Vue】 核心特性实战解析:computed、watch、条件渲染与列表渲染
目录一、计算属性(computed)✅ 示例:计算属性-methods实现:在插值模块里,实现函数的调用功能
风·之痕
2 年前
ios
·
swift
·
语法基础
Swift-语法基础
以关键字 var 开头的声明引入变量,该变量在程序执行期间可以具有不同的值。以关键字 let 开头的声明引入只读常量,该常量只能被赋值一次。
梁云亮
2 年前
python
·
语法基础
Python 语法基础二
执行这个命令可以查看所有内置函数和内置对象(两个下划线)测试:结果:结果:python 中有大量第三方库可用 "pip3 install 。。。"进行有需要的安装
我是有底线的