随笔分类 - C/C++
摘要:记录一个面试被问到的问题。 extern 有什么用途? 除了多文件共享全局变量外还有呢? extern "C" 的功能? 我想看完这篇文章就可以知道第三个问题了。 关于动态调用动态库方法说明 一、 动态库概述 1、 动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据
阅读全文
摘要:typedef: 如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾; 如果放在某个函数内,定义域就是从定义开始直到该函数结尾; #define: 不管是在某个函数内,还是在所有函数之外,作用域都是从定义开始直到整个文件结尾。 define在同一编译单元内部,就算在不同的命名空间内,其作用范
阅读全文
摘要:看一个例子: 输出结果: 为什么是这样的呢? 因为A是union,所以在内存中存储的格式为: 高地址 > 低地址 12 34 56 78 00010010 00110100 01010110 01111000 s.b 占据低地址的两个字节 s.c 占据高地址的两个字节 所以: s.b = 5678
阅读全文
摘要:from here 首先,我们来了解下定义: 内部连接:如果一个名称对编译单元(.cpp)来说是局部的,在链接的时候其他的编译单元无法链接到它。 外部连接:如果一个名称对编译单元来说不是局部的,而在链接的时候其他的编译单元可以访问它,也就是说它可以和别的编译单元交互。 通过对LIB与DLL的讲解,我
阅读全文
摘要:今天看STL内存配置器的时候,第一级配置器就是直接用malloc、free来管理内存。 而free和malloc都只需要传入或传出一个指针就能分配和释放内存了。 编译器是如何知道,这个指针指向的空间的大小的? 因为可能有下面这种情况. int a; int *p_a = &a; int *array
阅读全文
摘要:类内部的static成员,除了为const static 且为整数类型(int char bool)可在类内部初始化。 其他的都建议在对应的cpp文件中进行初始化。 test.h test.cpp
阅读全文
摘要:1. c++在调用构造函数时,才会把最开始的虚表指针指向虚表。 2.在构造函数或者析构函数中调用虚函数。 编译上没有问题。 运行时,调用虚函数不会发生多态行为,会调用正在构造的类的虚函数。 详细可见c++中的说明: //大意就是上面提到的运行时,因为子类没有构造好(指向虚表的指针都还没有初始化),所
阅读全文
摘要:VA_LIST是在C语言中解决变参问题的一组宏他有这么几个成员: 1)va_list型变量: #ifdef _M_ALPHA typedef struct{ char* a0; /*pointertofirsthomedintegerargument*/ int offset; /*byteoffs
阅读全文
摘要:-> 平时是对指针对象的基本操作。 A* a = new A(); a->do_something(); 直接就可以调用类内部函数。 而如果: A a;//a直接为对象时 a->func();//这个又是怎样的呢 这是由 C++ 标准规定的,对于a->mem根据a类型的不同,操作符->的解释也不同:
阅读全文
摘要:结果: 首先看上述的代码,print函数是带有默认参数的。 所以调用print(), print(-1)都可以准确的输出。 这种默认参数的情况会带来有些便利。(比如初始化一个商品对象,在99%的情况在都是正常的,那么这个商品是否正常的标记就可以默认为1,特殊的1%情况,再加上) 但是有以下三个要注意
阅读全文
摘要:空类默认会产生6个函数。 空类的大小为1,为了能有一个唯一的地址标识空类对应的对象。
阅读全文
摘要:我们都知道C++中有三种创建对象的方法,如下: 第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放,所以这就产生一个问题是把对象放在栈
阅读全文
摘要:from here
阅读全文
摘要:map经常把指针作为key,这种情况下。 我们经常会很自然的以为,如果要取元素时,会按照我们存的顺序拿到元素。 但是事实上不是这样的,因为map取得时候是按key的大小排序的,而如果用指针作为key,那么指针的大小就是很难预估的。 所以在用指针做为容器key时要额外注意。
阅读全文
摘要:【转自】here 编写程序不容易,编写多线程的程序更不容易。相信编写过多线程的程序都应该有这样的一个痛苦过程,什么样的情况呢?朋友们应该看一下代码就明白了, 上面的代码说明了一种情形。这种多线程的互斥情况在代码编写过程中是经常遇到的。所以,每次对共享数据进行操作时,都需要对数据进行EnterCrit
阅读全文
摘要:for (auto i : b) Fuck(i); 是 for (auto bitch = std::begin(b); bitch != std::end(b); bitch++) { auto temp = *bitch; Fuck(temp); } 的缩写 (来自知乎)
阅读全文
摘要:【转自 here】 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是类B的前置说明。这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面。如果没有类B的前置说明,下面的程序将不同通过编译,编译器将会给出类似“缺少类型说明
阅读全文
摘要:定义: 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。 用法: 在A类中加入: 下面这个程序说明了友元类与友元派生类的权限。
阅读全文
摘要:这就是一个纯虚析构函数,这种定义是允许的。 一般纯虚函数都不允许有实体,但是因为析构一个类的过程中会把所有的父类全析构了,所以每个类必有一个析构函数。 所以。纯虚析构函数需要提供函数的实现,而一般纯虚函数不能有实现
阅读全文
摘要:form here 用gdb 查看汇编代码, 采用disassemble 和 x 命令。 nexti, stepi 可以单步指令执行 如下例: 源代码: [root@hjj ~]# cat 1.c#include <stdio.h>int main(int argc, char *argv[]){
阅读全文