标签归档:c++

设计模式

For C/C++ user

很多设计模式相关的资料都是用Java来描述的,有必要简单补充一下JavaC++OOP技术层面上的区别

  • Java不支持任何形式的运算符重载
  • Java明确区分接口和类,类只能从一个类派生,但是一个类可以实现多个接口
  • 在Java中,所有方法默认是虚(virtual)的
  • 对CPP而言,Java风格的接口可以视为一个只有pure virtual
Read More

QT5编程基础

QT Module中的Qt Core和Qt GUI是唯二有必要仔细学习的部分, 这两部分涉及了QT的所有核心功能, 其余部分都可以在此基础上现学现卖.

本文主要介绍QT中比较重要的机制,其他知识相对来说都很独立,可以直接现学现用.

QT开发基础

  • Qt的很多特性都使用到了thread_local变量, 在多线程环境中,与QObject相关的功能只有两种保险的策略.
      1. 不直接跨线程使用QObject对象
      1. QObject
Read More

SomeCpp

零碎知识点

  • fflush仅仅是为了输出而设计的, 标准中并没有说明它对输入缓冲的效果.
  • 一元运算符和=是右结合的,这和<<是完全不同的,a=b=c意味着a=(b=c),b=c将先执行
  • C++11后引入了thread_local型的生命周期,这种对象和线程的生命周期是一致的
  • C++11中很多类型都支持列表初始化
Read More

Python for C++ Programner

这里谈一下个人的学习建议. 首先阅读官方的入门教程, 看完这一部分,对于一个熟练的C++程序员,应该可以凑合写出可堪一用的代码了. 然后是Python in a Nutshell 3rd第七章之前的内容(不含第七章),这一部分看完, 你就能基本了解Python的运行机制, 写出质量合格的代码了(但可能不够Pythonic).

上面两步完成后, 对一个熟悉C++的程序员而言, 基本任何Level的Python资料都可以看了. 如果偏应用,你可以继续看Python in a

Read More

[Cpp基础] [07] 复杂类型和类型推断

数组类型和函数类型

尽管在大部分场合中,数组类型和函数类型都被转换成某种指针使用,然而它们确实是某种类型.
这一点在类型推导中很重要,因为类型推导可以推导出数组类型/函数类型

  • T[N]型对象为数组类型,其中N必须为constexpr,称T array[N]中的arrayT[N]型的一个实例.
    • N是数组的一个属性,当N不同时,是不同类型的数组.
  • 数组类型变量可以被隐式转换为指向数组首元素的指针.
Read More

[Cpp基础] [06] 强制类型转换

强制类型转换

  • C++风格的类型转换为四个xxx_cast<TYPE>(var),每个都有特定的应用场合.
  • 转换总是通过创建临时量实现的,相当于TYPE tmp(var). 转换语句整体为tmp
  • 规定:仅有xxx_cast<TYPE &>(var)得到的临时量可以作为左值,其他情况都是右值。

const_cast

  • const_cast是只用于处理const
Read More

[Cpp基础] [05] const与constexpr

const限定符

  • const是一种编译期特性,用于限定对象的编译期写入权限
    • 换言之,其实可以通过各种trick在运行期写入对象.
    • 当项目很大,或者开发人员很多时,使用const就能利用编译器约束开发人员的行为,给开发人员做一定提醒.
    • const值往往还可以供编译器进行优化.
  • 原则上,当我们创建一个变量时,若认为它不应当被修改,就应当声明称const型.最常用的场合是函数形参/返回值中的const T
Read More

[Cpp基础] [03] 变量声明-定义及初始化

变量的”声明,定义”以及”初始化”

想要彻底理解这一部分的内容,你应该对OS/进程/虚拟内存/编译过程有一定的了解,仅从语言层次学习是比较抽象的.

声明和定义

  • 从编译的角度看:
    • 仅声明某个变量,那么就只创建了符号,这个符号不必分配存储空间,其具体地址需要在链接期resolve
    • 定义某个变量,在创建符号的同时,编译器为其分配了存储空间,符号地址在编译期就已经基本确定(后续可能会有重定位).
  • 对开发者而言:
    • 如果你希望使用某个已经存在的对象,那么就应该使用声明语句.
    • 每个定义语句都有”声明”的效果,不存在只定义不声明的语句.
  • 就C++而言,若语句仅有extern,且不含任何初始化部分,则该语句就是一个纯粹的声明,例如
    • extern T &val;//纯声明
    • extern T val;//纯声明
    • extern T
Read More