孟孟の新家

不定期更新,各种杂谈,如果你看见mzj又在装b,请迅速给他一脚并且让他滚去写代码

这一节主要给大家介绍C语言中经常令人迷惑的两个关键字const和static,考虑到大家的基础,我只在课堂上讲授最初级的内容,但是初级不等于不重要,也决不等于简单,相反,学好初级的内容在编程当中具有十分重要的意义,是各位今后理解更高级别代码的基石,希望大家对下面的内容做到精准掌握!后续,我会根据情况逐渐对这篇博客进行完善,补充一些更高级的用法和更深层次的知识,下面,让我们从内存开始——

内存布局

Windows

Windows是闭源的,有版权保护,资料较少,不好深入研究每一个细节,至今仍有一些内部原理不被大家知晓。下图是一个典型的 Windows 32位程序的内存分布:
Windows内存分布(图片为什么又不能正常显示了!!!)

const

是这样吗?

Me:
但是在我int &a = f(int b)的例子中,f函数返回的也是一个临时的整数值啊,为什么绑定到临时的整形上就不会错,绑定到临时的pair上就会错呢?
ChatGPT:
好问题!这涉及到 C++ 中的两种不同的语法和行为。

在 C++ 中,绑定到临时值的非 const 引用是允许的,但有一个重要的区别:

对于基本数据类型(如整数),非 const 引用可以绑定到临时值,因为整数是可修改的。

对于复杂的用户定义类型(如 pair<int, int>),非 const 引用不能直接绑定到临时值。这是因为,与整数不同,pair<int, int> 是一个复杂的对象,C++ 规定不能通过非 const 引用修改临时对象,以防止悬垂引用问题。

这就是为什么在你的原始代码中,当你尝试用非 const 引用绑定到 pair<int, int> 类型的临时值时,编译器报错的原因。而在 int &a = f(int b) 这种情况下,int 是一个基本数据类型,可以通过非 const 引用绑定到临时值。

如果你想要修改 pair<int, int> 类型的临时值,可以使用 const 引用:
1
2
3
cpp
const auto &[l1, r1] = f(s, i, i);
const auto &[l2, r2] = f(s, i, i + 1);

这样就能够避免编译错误。希望这能帮助解释这个问题。

这是真的吗???

长汀往事

关于长汀的心路历程,已经在叶子老师的采访中讲述完毕了,这里就略过了,等推送出了我把链接甩上来

最近复习一下语法,结合了以下三本工具书,记录一下有收获的点:

  • 《C++ Primer》
  • 《Effective C++》
  • 《More Effective C++》

封装

重载

个人认为,重载是C++区别于C的三大特性(封装,继承,多态)中属于封装的重要特性之一,注意,重载(Overloading)是一种封装(Encapsulation)的概念而非多态,它允许在同一个作用域内使用相同的名称,但是参数列表不同的函数或方法。

重载 是一种封装的概念,它提供了一种通过相同的名称执行不同操作的机制,提高了函数或方法的可用性和易用性。
多态 是面向对象编程的一个特性,它允许不同的对象对相同的消息做出不同的响应,提高了代码的灵活性和可扩展性。

下面介绍一些重载的高阶用法:

阅读全文 »

bug太多了,哭了啊,今天又修了一天,可算把搜索功能整好了,后续打算开发一个评论功能,看有没有精力吧zzz

字符串

在C++中,char str = "afefa"; 是一个不合法的语法。如果你想声明一个字符串,正确的方式是使用字符数组(C风格字符串)或者C++的std::string类。下面是两种合法的方式:

阅读全文 »

兄弟们,你们的到来使我感动不已,我只能说:Welcome to 我的新家,欢迎你们常来做客!

Declaration

本篇是建站以来第一篇文章,将来等文章多了他就刷到底下去了,但是一篇文章的沉底并不代表着他的消失和埋没,反而象征着这里古老的地基;有时候,网站和团队多么像啊,一篇篇文章就像团队的一个个人一样。希望将来再看到这篇文章的时候,还记得自己当时为什么出发>~<

————yours ymlf

0%