Essential C++ 读书笔记 之 Object-Based Programming

3dMax脚本类插件:不写 C++也能造“原生”工具 从plugin关键字到场景持久化,拆解 MAXScript 插件开发全流程! 阅读详情

 

作者用两章分别来介绍object-based(以下简称ob) 和objected-oriented(以下简称oo),弄清并区分这两个概念是理解这两章的基础。首先我们来看这两个术语的概念:

In a technical sense, the term "object-based language" may be used to describe any programming language that is based on the idea of encapsulating state and operations inside objects.

Object-oriented programming (OOP) is a programming paradigm that uses "objects" to design applications and computer programs. It is based on several techniques, including inheritance, modularity, polymorphism, and encapsulation. [Source: Wikipedia]

由概念可见,从技术上讲ob需要支持封装,而oo除了封装之外还要支持多态和继承。也就是说ob是oo的基础,支持oo的语言一定是ob的(如c++),但支持ob的语言不一定要支持oo(比如VB有类和对象的概念但不支持继承,所以不是面向对象的)。

Object-Based Programming这一章主要是熟悉类机制的设计和运用,涉及以下关键概念:

Class constructors and destructors, member initialization list, memberwise initialization,

const member function, mutable data member,

this pointer,

static class members,

friendship,

function object,

overloaded operator,nested types,

pointers to class member functions.

1. 类就是对事物的抽象,C数据结构的概念即来源于此。设计类实质就是设计数据结构。跟C的数据结构相似,类包括数据成员(属性)和一些操作(方法)。以上是从对事物抽象的角度看类,从用户的角度讲类又可看作包括 public interface 和private impementation. 而对用户可见的只有public interface(如function prototype).

2.class和structure都是用户自定义类型,注意二者的定义最后都以一个分号(;)结束。

3.区分class declaration和class definition.如下面是一个class declaration:

class Stack;

它的作用就是对编译器引入类的名字,但不提供它包括的数据成员和操作的细节。这样一个声明只允许你定义指向该类的指针或在类声明中用作类型说明符。

Stack *pt=0;
void process(const Stack&);

而在类的定义出现之前不允许你定义该类的对象或引用类的任何成员。比如下面是错误的:

Stack st; //invalid definition
void process(const Stack &st){
    st.clear();  
//invalid operation
}

下面是一个class definition.

class Stack{
public:
    
//... public interface
private:
    
//... private implementation
}
;

4. 区分member function declaration和member function definition.

member function declaration必须出现在class definition之中。如:

class Stack{
public:
bool push(const string&); //member function declaration.
//... other things go here.
private:
//... private implementation
}
;

member function definition既可以出现在class definition(.h文件)之中,也可以在class definition之外的program text(.cpp文件)中。出现在class definition中的member function definition自动做为inline函数。而出现在program text中的member function definition,函数名字前面要加一个class scope operator.如:

//Stack.h
class Stack{
public:
bool push(const string&); //memeber function declaration.
bool full() {return _stack.size()==_stack.max_size();} //memeber function definition inside class definition, automatically treated as being inline
//other public things go here..
private:
vector
<string> _stack;
}
;

//Stack.cpp
//memeber function definition outside class definition.
bool Stack::push(const string &elem){
if(full()) return false;
_stack.push_back(elem);
return true;
}

5. 构造函数和析构函数都没有返回值。构造函数可以有参数,所以可以重载,而析构函数不允许有参数,所以不能重载。定义析构函数不是必须的,它主要用来释放在构造类时申请的空间,从而使类的用户不必知道内存管理的细节。

6.default memberwise initialization的缺陷和解决办法。

当我们用一个类的对象去初始化另一个对象时,类的data members会依次拷贝。 但当类的data members中包含指向在类初始化时申请的空间的指针时,指针值的拷贝只会使两个对象中的指针指向同一空间,而不是申请新的空间,在该空间销毁时会出现问题。比如:

class Matrix{
public:
    Matrix(
int row, int col)
        :_row(row), _col(col)
    
{
        _pmat
=new double[row*col];
    }

    
~Matrix
    
{
        delete[] _pmat;
    }

private:
    
int _row,_col;
    
double *_pmat;
}
;

//Example
{
    Matrix mat(
4,4);
    
{
        Matrix mat2
=mat;
        
//default memberwise copy applied
        
//... use mat2 here
        
//destructor applied here for mat2
    }

    
// ... use mat here
    
//destructor applied here for mat
}

default memberwise initialization使两个实例中的_pmat指向了堆中的同一数组。当mat2析构的时候,数组空间被释放。但是之后,mat的_pmat仍然指向和操作已经释放了的数组空间,这是一个严重的bug。

这就要去我们在设计类的时候考虑default memberwise initialization的行为对类来说是否合理,不合理的我们就要提供explicit copy constructor.如

Matrix::Matrix(const Matrix &rhs)
    :_row(rhs._row), _col(rhs._col)
{
    
int elem_cnt=_row*_col;
    _pmat
=new double[elem_cnt];
    
    
for(int ix=0; ix<elem_cnt; ++ix)
        _pmat[ix]
=rhs._pmat[ix];
}

或者copy assignment operator 如:

Matrix& Matrix::operator=(const Matrix &rhs)
{
    
if(this!=&rhs)
    
{
        _row
=rhs._row; _col=rhs._col;
        
int elem_cnt=_row*_col;

        delete[] _pmat;
         _pmat
=new double[elem_cnt];
        
for(int ix=0; ix<elem_cnt; ++ix)
            _pmat[ix]
=rhs._pmat[ix];
    }

    
return *this;
}

7.为了保证const class object不被修改,则必须保证它调用的方法不会修改其调用者。为了让编译器知道这些方法不会修改其调用者,类设计者必须对这些方法标为const。注意const修饰符出现在参数列表后面。定义在类体外的成员函数,必须在声明和定义处都标上const修饰符。const  class object只能调用标为const的方法,而不能调用公开接口中的non-const成分。

另外,const member function返回data member的non-const reference也是不允许的,因为data member可能在程序的其他地方被修改。member functions可以根据const与否而重载(另外,函数可以根据参数多少和类型不同重载,但不可以根据返回值类型不同重载),所以可以可以提供两个版本的成员函数,一个是const member function返回data member的const reference,另一个是non-const member function返回data member 的non-const reference。这样对于一个non-const class object, non-const 版本被调用。对于const class object, const版本被调用。例如:

class val_class{
public:
    val_classs(
const BigClass &v)
        :_val(v)
{}

    
const BigClass& val() const {return _val}
    BigClass
& val() {return _val;}
private:
    BigClass _val;
}
;

void example(const BigClass *pbc, BigClass &rbc)
{
    pub
->val(); //invokes const instance
    rbc.val(); // invokes non-const instance
    
//...
}

把一个data member标为mutable则意味着对它的修改不会影响该类对象的const-ness。这种data member一般起辅助作用,而其本身并不是事物属性的抽象。如果一个member function修改了mutable data member仍可以标为const。

 8. 在成员函数内部,this 指针指向调用该成员函数的对象。在内部实现上,编译器为每个成员函数添加一个参数即this指针。该成员函数被调用的时候,编译器会自动添加一个参数即调用该成员函数的对象的地址。如:

Triangular& Triangualr::copy(const Triangular &rhs)
{
    _length
=rhs.length;
    _beg_pos
=rhs._beg_pos;
    _next
=rhs.beg_pos-1;
    
    
return *this;
}

//Invoke
Triangular tr1(8);
Triangular tr2(
8,9);
tr1.copy(tr2);

//Internal Member Function Transformation
Triangular& Triangualr::copy(Trangular *this,const Triangular &rhs)
{
    
this->_length=rhs.length;
    
this->_beg_pos=rhs._beg_pos;
    
this->_next=rhs.beg_pos-1;
    
    
return *this;
}

//inter code transformation:
//tr1 become the class object addressed by this pointer
tr1.copy(&tr1,tr2);

与此类似,作为函数返回值的对象,也被大多数C++编译器优化为一个额外的引用参数。

9. Static Class Members.(static data members, static function members)

static data members跟非成员函数里的局部静态变量类似,static data members为所有该类的对象所共享的单一实例。因为只有一个实例,我们必须在program text中对该实例进行显式的定义,必要的话也可以对他进行初始化。

class Triangular{
public:
    
//...
private:
    
static vector<int> _elems;
    
static int _initial_size;
}
;

//placed in program text file, such as Triangular.cpp
vector<int> Triangular::elems;

//an initial value, if desired, can also be specified
int Triangular::_initial_size=8;

const static data member 可以在它的声明中进行初始化。

class intBuffer{
public:
    
//...
private:
    
static const int _buf_size=1024; //ok
    int _buffer[_buf_size]; //ok
}
;

non-static member function通过this指针访问存贮在调用它的对象内部的non-static data member. 而对于那些只访问static data member而不访问non-static data member的成员函数,它的调用可以独立与特定的对象,这就是所谓的static member function。当static class member定义在类体之外时,关键字static不必重复。

10.运算符重载的规则:

(1).不能引入新的运算符

(2)不能改变运算符的元数

(3)不能改变运算符已有的优先级

(4)不能为非class类型重新定义已有的运算符

一个运算符可以被定义为member operator function,也可以被定义为nonmember operator function。nonmember operator function往往比member operator function多一个参数,因为对于member function来说,this指针隐喻代表做操作数。对于iostream operator最好定义为nonmember function。因为memeber function要求左操作数是该类的对象,这样会使用户感到迷惑:比如

 

ostream& Triangular::operator<<(ostream &os)
{
    
//...
    return os;
}


Triangular tri(
6,3);
tri
<<cout<<' /n';  //confusing 

下面是定义为nonmember function:

ostream& operator<<(ostream &os, const Triangular &rhs)
{
   
//.....
    return os;
}


Triangular tri(
6,3);
cout
<<tri<<' /n';

注意函数里,我们返回了传入的同一ostream对象,这样的目的是可以连接使用多个output操作符。

11. increment operator function有prefix(++object)和postfix(object++)两种个版本。prefix版本定义时参数列表为空。但是,每个重载的运算符必须有一个唯一的参数列表,所以postfix版本就不能再用空参数列表。C++语言给出的解决方案是用一个int类型做参数来定义postfix版本。但是在调运的时候我们不必给出这个参数,而是由编译器自动生成。

12. 嵌套类型(Nested Types)其实就是在Class definition内的typedef,其作用范围在只在类内部。可以利用它给一种已有类型起一个别名。这样我们可对不同的类定义用相同的名称嵌套在类里,从而提供了一种抽象机制,让这些类可以有统一的操作接口。如:

class Triangular{
public:
    typedef Triangular_iterator iterator;
    
//......
private:
    
//......
}
;

class Fibonacci{
public:
    typedef Fibonacci_iterator iterator;
    
//......
private:
    
//......
}
;

Triangular::iterator fit
=fib.begin();  //instead of Triangular::Triangular_iterator fit=fib.begin();
Fibonacci::iterator trt=tri.begin();  //instead of Fibonacci::Fibonacci_iterator trt=tri.begin();

13. friend 的位置不受public,private的影响。要想把重载函数的多个版本都声明为某类的友元,必须逐一列出。把类A的几个成员函数声明为类B的友元,必须在定义类B之前给出类A的定义。如果是把整个类A声明为B的友元,则之前只需给出类A声明即可。如:

//example1
class Triangular_iterator{
public:
    
int operator*() const;
    
//......
private:
   
void check_integrity() const;
}
;

class Triangular{
friend 
int Triangular_iterator::operator*();
friend 
void Triangular_iterator::check_intergrity();
//......
}
;
//---------------------------------------------------------------------
//example2
class Triangular_iterator;

class Triangular{
friend 
class Triangular_iterator;
//......
}
;

应用Friendship基本上是由于性能的原因,比如在非成员函数中Point和Matrix的相乘。如果仅仅是为了读写data member可以为这些data member写一个inline public access function来访问它们,以替代friendship。

14.Function object是一个实现了函数调用运算符重载的类。当编译器遇到一个貌似是函数调用的东西比如:

f(ival);
f可以是函数、函数指针或者Function Object。 如果f是一个类的对象的话,编译器会在内部把这条语句变成:
f.operator()(ival); // internal transformation
我们通常把function object作为泛型算法的参数使用。
class LessThan{
public:
    LessThan(
int val):_val(val){}
    
int comp_val() const {return _val;}
    
void comp_val(int nval){_val=nval;}
    
bool operator() (int value) const;
private:
    
int _val;
}
;

inline 
bool LessThan::operator()(int value)const
{return value<_val;}

void print_less_than(const vector<int> &vec,int comp, ostream &os=cout)
{
    LessThan lt(comp);
    vector
<int>::const_interator iter=vec.begin();
    vector
<int>::const_interator it_end=vec.end();
    
    os
<<"elements less than "<<lt.com_val()<<endl;
    
while((iter=find_if(iter,it_end,lt))!=it_end)
    
{
        os
<<*iter<<' ';
        
++iter;
    }

}

15. 类成员函数指针跟普通的函数指针类似必须指明返回类型和参数列表,却也有几点不同:

(1)声明的时候必须在指明它是指向哪个类的成员函数,须在前面加一个class scope operator,

void (num_sequence::*pm)(int)=0;

pm初始化为0,指明它现在还没指向任何成员函数。也可以用typedef简化声明。

typedef void (num_sequence::*PtrType)(int);
PtrType pm
=0;
(2).指向成员函数的指针必须通过该成员函数所在类的实例调用,如:
num_sequence ns;
num_sequence 
*pns=&ns;
PtrType pm
&num_sequence::fibonacci;

(ns.
*pm)(pos); //equivalent to ns.fibonacci(pos);
(pns->*pm)(pos);  //equivalent to pns->fibonacci(pos);
解决com.kingbase8.util.KSQLException: This _connection has been closed. 一个消息管理系统,系统采用kingbase8数据库,数据库采用单体模式,后台应用也采用springboot单体模式。系统正式上线后,出现几个JDBC响应的异常信息: com.kingbase8.util.KSQLException: An I/O error occurred while sending to the backend. java.net.SocketTimeoutException: Read timed out. 阅读详情

相关推荐

深入分析大众点评 Ajax 接口:直接请求 JSON 数据高效获取评论

大众点评网站采用前后端分离架构,通过Ajax接口动态加载数据。按F12打开开发者工具,切换到Network(网络)面板。实际环境中,我们需要使用Python重现这一加密逻辑。查看请求响应,寻找包含评论数据的JSON接口。参数是大众点评的反爬机制核心,需要特别处理。:尊重网站的robots.txt文件规定。:仅将数据用于合法合规的研究和分析目的。:不侵犯大众点评的商业秘密和知识产权。打开大众点评网站,进入任意商户页面。:对采集到的用户信息进行脱敏处理。:避免对目标网站造成过大负担。

Z_suger7的博客 1580

Object-Based与Object-Oriented的区别,个人理解

封装ob 多态继承oo 基于对象是一种Abstract DataType,它封装了一些复杂的操作,使之易于使用。 比如说string,在C++中,通过类来实现。(封装一些数据及一些操作) 面向对象的核心是多态,关键在于你不必知道对象的真正类型,只要知道它是一种什么类型,C++中,通过类,继承,虚函数来实现。 《深度探索C++对象模型》上第一章最后几段的话: Object-ori

jingsihu的专栏 4052

光电振荡器(OEO):从原理到应用,解锁高频微波信号新纪元

本文深入解析了光电振荡器(OEO)的核心原理与前沿应用。OEO通过巧妙的光-电-光转换机制,利用光学谐振腔产生高频、高纯度、低相位噪声的微波信号,有效突破了传统电子电路的频率瓶颈。文章详细拆解了其工作流程,并探讨了在雷达系统、高速光通信及精密测量等领域的硬核应用价值。

weixin_29231027的博客 364

基于对象的(Object-based)和面向对象的(Object-oriented)有何联系区别?

基于对象(OB)和面向对象(OO)是两个极易混淆的概念。两者的区别是多态,和继承无关。 面向对象(OB),用纯粹的理论去理解就是,必须具备封装、继承、多态三大特点,缺一不可。可以根据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式(多态)。 基于对象 (OO),仅仅支持抽象数据类型的功能(ADT),通常指的是对数据和操作的封装。无法利用现有的对象模板产生新的对象模型,继而产生新...

Janway-Win 1461

STM32单片机入门学习(六)-光敏传感器控制LED

光敏传感模块一DO端接B13,GND接GND,VCC接VCC,AO不接。LED负极接B12,正极接VCC。

指尖魔法师 4368

Wireshark时间分析实战:精准调试网络延迟与时间同步问题

本文深入探讨了Wireshark在网络延迟与时间同步问题分析中的核心应用。通过实战案例,详细讲解了如何设置时间显示格式、利用时间参考点量化关键路径延迟,以及运用时间平移功能校正错位时间轴。掌握这些时间分析技巧,能帮助网络工程师精准定位隐藏于数据包时序中的性能瓶颈与故障根源。

weixin_29290963的博客 261

Essential C++ 4_Object-Based Programming

Before we can use a class, we must make it known to the program because the class is not built into the language. Usually, we do this by including a header file: #include string pooh[ 4 ] = {

ShuaiWang优快云的博客 627

高温环境下RS485通信故障分析与MOS管解决方案

RS485通信作为工业控制领域的基础总线技术,其可靠性直接影响系统稳定性。在高温等恶劣环境下,传统三极管开关电路会因温度特性导致通信故障。通过分析三极管Ube电压随温度变化的特性,揭示了电路失效的物理原理。相比之下,MOS管作为电压控制型器件,具有温度稳定性好、功耗低等优势,更适合工业环境应用。本文通过一个发动机舱内RS485通信故障的实际案例,详细对比了三极管与MOS管在高温环境下的性能差异,并给出了具体的电路改进方案。该案例对工业通信接口设计具有普遍参考价值,特别适用于需要应对高温、振动等挑战性环境的硬

weixin_42612405的博客 405

选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP

本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。

ACP广源盛的博客 214

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 649

STM32入门教程:自动门控制

通过这个简单的示例,我们展示了如何使用STM32微控制器来实现一个简单的自动门控制系统。如果有物体靠近门口,我们会改变doorState的值,并使用controlServoMotor函数来控制舵机电机的转动。具体的引脚连接可以根据您的具体硬件来定,例如将红外传感器的输出引脚连接到GPIOA_PIN0引脚。同样,具体的引脚连接可以根据您的具体硬件来定,例如将舵机的控制引脚连接到GPIOA_PIN1引脚。首先,我们需要包含必要的库文件和引用。然后,我们需要定义一些函数来处理红外传感器的输入和舵机电机的输出。

m0_75244442的博客 577

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 385

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 329

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[C++]:6.STL:vector

今天就要开始学vector容器,这节课我们主要学习vector中经常会用到的函数,并且给出该函数的模拟实现。话不多说,直接上干货。下面是本章的思维导图,那么,让我们开始吧!

2301_80817679的博客 136

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析

蓝桥杯报名正在火热进行(软件赛报名 2026-10-08—12-18,省赛 2027-04-10),电子学会 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名也已开启(9/23—12/2),全国青少年信息素养大赛算法应用主题赛同步推进——把 LCA 这个模板练熟,正是冲刺这些赛事树型考点的关键一步。所谓「最近公共祖先」:在一棵以某个节点为根的树里,两个节点 u、v 向上追溯,最早交汇的那个祖先就叫它们的 LCA。比如家谱里,你和你表哥最近的共同长辈就是你们的祖父。

IT_Scratch的博客 530

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 369

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 336

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 295

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 434

C++ 求抛物线的顶点、焦点和准线(Finding the vertex, focus and directrix of a parabola)

已知抛物线方程 $ y = ax^2 + bx + c $,可利用公式求其顶点、焦点和准线。顶点为 $ \left( -\frac{b}{2a}, \frac{4ac - b^2}{4a} \right) $,焦点为 $ \left( -\frac{b}{2a}, \frac{4ac - b^2 + 1}{4a} \right) $,准线方程为 $ y = c - \frac{b^2 + 1}{4a} $。以 $ a=5, b=3, c=2 $ 为例,计算得顶点 $(-0.3, 1.55)$,焦点 $(-0

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 163

c++ 超级大坑未定义行为如何避免(下)

尤其是通过。

拒绝AI文,努力在AI时代写出感动人心的好文章 141

华为校招笔试真题 10.28 - 稀疏整数求和(C++/Py/Java /Js/Go)

华为非AI笔试 10月28号真题,华为笔试第二题【稀疏整数求和】,提供详细思路讲解以及Java、C++、Python、Go、JavaScript多语言代码实现。华为非AI笔试笔试真题【稀疏整数求和】多语言题解。

qq_45776114的博客 615

C 语言指针与输入输出

指针是 C 语言的魂,输入输出是和人交互的入口。这篇文章把"变量在内存里到底长什么样"讲透,接着用代码验证原码/反码/补码为什么非用补码不可,再拿进制转换、数组、printf/scanf 的格式符收尾。所有输出都是本机 gcc 真实跑出来的。

2401_89953644的博客 155

从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架

人机共存”正逐渐成为家用 UV-C 空气消毒产品的核心卖点。其中一类常见结构,是把 254 nm 紫外线灯置于吊扇扇叶上方,以扇叶盘作为物理遮挡,同时借助风扇强制对流实现空气循环消毒。专利文献对该结构的意图描述相当清晰:消毒平台遮挡紫外线灯朝下发出的光,使光线射向天花板,从而“不会让紫外线辐射到位于吊扇灯下方的用户”。然而,“结构上不直射”与“工程上安全且有效”之间,仍隔着一段需要实测数据来填补的距离。

HANDY09200的博客 690

【C++】【STL】string_OJ题

本文总结了9道C++ STL中关于string的OJ题目,按操作类型分为三组:反转与就地修改(如917、541、151)、计数与查找(如387、125、58)、模拟与大数运算(如415、43、8)。核心技巧包括双指针收敛、字符分类处理、进位控制及边界值处理。所有题目使用同一套源码,在标准库std::string与自定义容器MyString间切换仅需宏定义,验证结果一致性。代码通过随机测试用例与Trace函数逐行比对,确保逻辑正确性,强调接口对齐的重要性。

这里是Cocatrice的博客,感谢大家一直以来的支持和鼓励,如果对C/C++方向感兴趣的话,可以通过主页的微信名片加Cocatrice的好友,也可以通过邮箱:Chen31980094@163.com 联系,一同加油! 4356

C 语言 malloc() 详解与实战 Demo

本文详解C语言malloc()函数,涵盖其语法、内存原理及实战应用。通过动态整数、数组、结构体与链表的Demo,演示如何安全申请、使用与释放内存,强调避免内存泄漏与空指针检查的重要性,帮助开发者掌握动态内存管理核心技能。

tangPHP的博客 363
上一篇: 安家~
下一篇: 免费午餐已经结束
linuxyuking
博客等级 码龄20年 2粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值