学习笔记:C++学习笔记

MinGW下载和安装教程 🔗

要知道,GCC 官网提供的 GCC 编译器是无法直接安装到 Windows 平台上的,如果我们想在 Windows 平台使用 GCC 编译器,可以安装 GCC 的移植版本。

目前适用于 Windows 平台、受欢迎的 GCC 移植版主要有 2 种,分别为 MinGW 和 Cygwin。其中,MinGW 侧重于服务 Windows 用户可以使用 GCC 编译环境,直接生成可运行 Windows 平台上的可执行程序,相比后者体积更小,使用更方便;而 Cygwin 则可以提供一个完整的 Linux 环境,借助它不仅可以在 Windows 平台上使用 GCC 编译器,理论上可以运行 Linux 平台上所有的程序。

利用cygwin在windows下编写c程序 🔗

Cygwin是一个GNU和开源工具的大量集合,它们提供的功能类似于 Windows上的 Linux发行版.
Cygwin(发音为SIG-win)= GNU + Cygnus + Windows。官方网站是www.cygwin.com。
Cygwin是一个开放源代码的适用于Windows的Linux环境,由两部分组成:

  1. 一个DLL(cygwin1.dll),充当Linux API模拟层,提供大量的Linux API功能。
  2. 一系列提供Linux外观和感觉的工具。

在windows下用C编程之前,首先需要安装Cygwin(据说MinGW也可以),cygwin可以到官网去下载,可以选择 setup-x86_64.exe(64位) 或者是 setup-x86.exe(32位)来安装。

类模板究竟要不要接口与实现分离? 🔗

“C++ 编译器是不支持对模板的分离式编译的”。
就像类一样,类模板是可以将其实现与声明放在一起的,或者也可以将接口与实现分离。
但是呢,编译器由于历史原因对于分离式编译的支持非常弱,并且因平台的不同支持力度有所不同。

内部类的声明和定义 🔗

内部类也就是内部的类,是包含在一个类里面的类。
此时这个类不属于外部的类,不能通过外部类的对象直接调用内部类,外部的类对内部的类没有任何优越的访问权限。

… function is not marked const 🔗

常成员函数是不能调用普通的成员函数的。

在C++中我如何通过子类的友元函数访问父类的保护类型的成员 🔗

C++基类的保护类型成员是完全被派生类所继承的,所以子类的友元函数是可以直接访问子类中的那些继承来的成员, 但是这与基类是没有关系的,友元函数只是一对一的关系。比如你基类Shape有个保护类成员radius, 子类Circle有个友元函数calcarea(), 那么calcarea函数就可以访问用Circle申明的对象的radius成员,但是不能访问用Shape申明的对象的radius成员。

深入理解C++中public、protected及private用法 🔗

初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++中public、protected及private用法。相信对于大家深入掌握C++程序设计会有很大的帮助。
这里我们首先要明白下面几点。

  • 类的一个特征就是封装,public和private作用就是实现这一目的。所以:
    用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。
  • 类的另一个特征就是继承,protected的作用就是实现这一目的。所以:
    protected成员可以被派生类对象访问,不能被用户代码(类外)访问。

const T、const T*、T *const、const T&、const T*& 的区别 🔗

  • const T:定义一个常量,声明的同时必须进行初始化。一旦声明,这个值将不能被改变。
  • const T*:指向常量的指针,不能用于改变其所指向的对象的值。
  • const int* const 与int* const的区别:指针本身就是一种对象,把指针定义为常量就是常量指针,也就是int* const的类型,也可以写成int *const,声明时必须初始化。const int* const 是一个指向常量对象的常量指针,即不可以改变指针本身的值,也不可以改变指针指向的对象。
  • const T&:对常量(const)的引用,又称为常量引用,常量引用不能修改其邦定的对象。允许为一个常量引用邦定一个非常量对象、字面值,甚至是表达式;引用的类型与引用所指向的类型必须一致。
  • const T*&与T *const&:指向常量对象的指针的引用,这可以分两步来理解:
    1. const T*是指向常量的指针;
    2. const T*&指向常量的指针的引用。

reference to non-static member function must be called 🔗

这个问题是指你引用(调用)了非静态函数,但你不是通过类对象来调用的。问题的来源就是sort()函数的第三个谓词参数。为什么会是这样的呢?
按照常理来说,同一个类的非静态const成员函数中能相互调用,而不用通过类对象进行访问,为什么这里不行呢?相反如果我们把谓词函数com()定义为static函数问题就没有了。
问题的原因其实就是函数参数不匹配的问题。因为我们普通的成员函数都有一个隐含的this指针,表面上看我们的谓词函数com()只有两个参数,但实际上它有三个参数,而我们调用sort()排序函数的时候只需要用到两个参数进行比较,所以就出现了形参与实参不匹配的情况(函数有三个形参,但是只输入了两个实参)。
所以,解决办法就是把谓词函数com()定义为static成员函数。

重载new和delete 🔗

用new创建动态对象时会发生两件事:(1)使用operatoe new()为对象分配内存(经常是调用malloc)(2)调用构造函数来初始化内存。相对应的调用delete运算符会(1)首先调用析构函数(2)调用operator delete()释放内存(经常是调用free)。我们无法控制构造函数和析构函数的调用,是由编译器调用的。但可以改变内存分配函数operator new()和operator delete()。

C++ STL迭代器原理和实现 🔗

为了提高C++编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector、list、map、set等。然而有些容器(vector)可以通过下标索引的方式访问容器里面的数据,但是大部分的容器(list、map、set)不能使用这种方式访问容器中的元素。为了统一访问不同容器时的访问方式,STL为每种容器在实现的时候设计了一个内嵌的iterator类,不同的容器有自己专属的迭代器(专属迭代器负责实现对应容器访问元素的具体细节),使用迭代器来访问容器中的数据。除此之外,通过迭代器可以将容器和通用算法结合在一起,只要给予算法不同的迭代器,就可以对不同容器执行相同的操作,例如find查找函数(因为迭代器提供了统一的访问方式,这是使用迭代器带来的好处)。迭代器对一些基本操作如*、->、++、==、!=、=进行了重载,使其具有了遍历复杂数据结构的能力,其遍历机制取决于所遍历的容器,所有迭代器的使用和指针的使用非常相似。通过begin,end函数获取容器的头部和尾部迭代器,end迭代器不包含在容器之内,当begin和end返回的迭代器相同时表示容器为空。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lcy_Knight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值