Python for C++ Programner

这里谈一下个人的学习建议.

首先可以阅读官方的入门教程, 看完这一部分, 对于一个熟练的C++程序员, 应该可以凑合写出可堪一用的代码了. 对于大部分不以Python为主要工作语言的开发者,到此基本就足够了.

如果有时间,我建议直接阅读Python in a Nutshell第七章之前的内容(不含第七章),并不用完全看懂,大部分细节也不用去记忆,只需要看完即可,至此,你就能基本了解Python的运行机制, 写出质量稳定可控(不会存在低级错误)的代码了.

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

Read More

[Cpp基础][09]C++11多线程编程基础

C++11为多线程开发准备了一套标准的基础设施,主要为<thread>,<mutex>,<condition_variable>, 这套组件基本是"pthread"的标准化.本文主要介绍C++11多线程开发相关的基础内容.如果需要更多的细节,可以直接google或者查手册进行了解.

可调用对象

可调用对象在C++ 11中是非常重要的概念, 它使得"函数"变得更加像对象. 线程库完整的支持可调用对象.

  • 支持()运算符的对象都是可调用对象,这些工具的设计比较独立,可以在使用时再查reference,常见的有
    • bind创建的对象
    • lambda
    • 重载了()的类
    • 函数/函数指针
Read More

C++ OOP编程综述

嵌套类和局部类

  • 定义在类X内的类Y称为嵌套类,它就是一个普通类,只不过使用的作用域被限制了.
  • 定义在函数内的类Y称为局部类,这种类限制很多,主要用于在语言层面支持Lambda,实践中基本不用.

struct和class的内存布局

  • C++的struct和class实例大小不会为0,即便它内部没有任何成员函数或成员变量.主要是因为编译器总是需要为实例分配内存,使得对象能获得有效的地址,且不同对象的地址总应该是不同的.
  • 类型布局相关的种类有很多,如POD,Aggragate,naive等,具体我也不是很清楚,总之很麻烦.
    • 如果需要把sturct或class对象通过C风格直接从内存层面管理(如memcpy),那么就必须要求它的内存布局是平凡的.
  • C++11之后,编译器只保证:
    • 同一个权限声明符block内的对象是顺序存储的(可能因对齐而不连续)
    • 同一个权限声明符level的不同block相对顺序是确定的
    • 编译器允许在满足上面约束的前提下任意重排类的内存布局.
  • 多继承时,相当于每个基类对象顺序排布在内存中.
    • 例如,若C继承自A和B,那么C的布局整体上看是[[vptrA,...][vptrB,...]],vptrA指向了TableC_A,vptrB
Read More

[Cpp基础][11]”异常”

异常

  • C++内所说的异常是指:可以预见的非正常状况,例如输入的指针为空;而非不可预见的问题,例如突然停电,或者突然被用户把进程kill掉,并不是C++需要处理的"异常"
  • 异常特性会导致程序的执行流程不可控,且往往对OS及runtime有一定的要求(可移植性差),所以没有特殊需求时,不应当使用这个特性.
  • throw-try-catch是异常系统的典型三个环节.
    • throw出的可以是任意对象,只要catch处声明的对象可以用throw的对象初始化即可.习惯上我们会专门设计一个类,因为自定义类可以承载更多的信息
    • 异常catch中的形参可以使用引用,以使用多态机制
  • 异常抛出后寻找catch的过程称为栈展开,被展开的函数栈内所有局部对象都将被销毁,因此抛出的异常对象必须不依赖局部对象.
  • 标准库内提供了以exception为基类的若干异常,我们可以使用这个类,也可以自定义类,该类的const char * what()成员用于给用户提供信息.
    • catch时,优先使用引用, 从而保证能派生类实例能绑定到基类参数上.
Read More

[Cpp基础][10]重载运算符

重载运算符

规定

  • 赋值,取下标,调用,箭头,类型转换,这些运算符只能作为成员函数.
  • 用户重载的&&||不会进行短路求值.

习惯

  • 重载主要分为全局重载和类内重载,一般而言,二元运算都应该在全局重载(顺序问题).
  • 改变对象状态的运算符一般应当设为成员函数,拥有对称性的运算符一般应在类外重载.
  • 从技术层面说,重载运算符的参数可以是指针类型的,但是这一般与我们使用语言的习惯不符,所以形参类型最好只是TT&,而不要是指针.
  • 定义有关联的重载运算符时一定要考虑兼容性,例如a<b为假,a>b
Read More

Google NCR ZH

因为一些众所周知的原因,我们不希望使用中文版的谷歌,但是往往又希望中文界面.以下面的链接作为查询网址即可

https://www.google.com/ncr#hl=zh-CN&q=%s
Read More

从宿主访问Ubuntu虚拟机的文件

背景: 开发中希望能从宿主直接访问虚拟机的文件,例如用office打开word,用 source insight 阅读代码等。

  • 虚拟机为16.04 ,宿主为Windows 10 1803,samba试了很多次,就是不行。

  • ftp方案:

  1. sudo apt-get install vsftpd
  2. sudo vi /etc/vsftpd.conf,并在末尾粘贴以下内容
anonymous_enable=YES
anon_root= abs_path_to_dir
Read More

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

数组类型和函数类型

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

  • 数组类型逻辑上类似于std::array,由TN两个属性决定唯一的数组类型,称T[N]型对象为数组类型,其中N必须为constexpr,称T array[N]T[N]的一个实例.
    • T
Read More