C/C++
文章平均质量分 79
buxizhizhou530
这个作者很懒,什么都没留下…
展开
-
struct 结构体以及 typedef struct
1.C语言中,声明一个结构体如下:原创 2014-05-04 21:29:33 · 1191 阅读 · 0 评论 -
C++ 空白基类最优化(EBO 或 EBCO)
对于c++中的一个空类 class X{}; 事实上并不是空的,sizeof(X)并不等于0, 一般的结果是1。每个X的对象都有一个隐晦的1 bytes,是被编译器安插进去的一个char,这样可以使得这个class的两个objects在内存中配置独一无二的地址。当X作为另一个类的成员时,如:class A{public: X x;原创 2015-05-21 10:57:01 · 1320 阅读 · 0 评论 -
PKU C++程序设计实习 学习笔记6 标准模板库STL
标准模板库STL8.1 STL概述1.泛型程序设计C++ 语言的核心优势之一就是便于软件的重用C++中有两个方面体现重用:1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic programming) 的思想: 模板机制,以及标准模板库 STL简单地说就是使用模板的程序设计法。将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成原创 2015-05-10 12:02:15 · 1875 阅读 · 0 评论 -
C++ 二维数组/多维数组的动态分配(new)和释放(delete)
1. 一维数组对于简单的一维数组动态内存分配和释放,如下:int *array1D;//假定数组长度为m//动态分配空间array1D = new int [m];//释放delete [] array1D;2. 二维数组二维数组的动态分配和释放//假定数组第一维长度为m, 第二维长度为n//动态分配空间int **array2D = new int *[原创 2015-05-27 23:15:32 · 9469 阅读 · 0 评论 -
PKU C++程序设计实习 学习笔记4 运算符重载
第四章 运算符重载4.1 运算符重载的基本概念1. 运算符2. 自定义数据类型与运算符重载C++提供了数据抽象的手段:用户自己定义数据类型 -- 类• 调用类的成员函数—>操作它的对象类的成员函数—>操作对象时,很不方便• 在数学上,两个复数可以直接进行+/-等运算 Vs. 在C++中,直接将+或-用于复数是不允许的3. 运算符重载对抽象数据类型也能原创 2015-05-26 20:25:29 · 1100 阅读 · 0 评论 -
C++ 四种类型转换操作符
一、C风格类型转换操作符(type) expression例子:int firstNumber, secondNumber;double result = ((double)firstNumber)/secondNumber;二、C++类型转换操作符1.static_cast 在功能上基本上与 C 风格的类型转换一样强大,含义也一样。double r原创 2015-05-18 23:06:11 · 1852 阅读 · 0 评论 -
数据对齐/内存对齐 && 数据格式
字、双字、四字在自然边界上不需要在内存中对齐。(什么叫做字?见数据格式)对字、双字、四字来说,自然边界分别是偶数地址、可以被4整除的地址、可以被8整除的地址。无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要做两次内存访问;然而,对齐的内存仅需要一次访问。未对齐的:一个字或双字操作数跨越了4字节边界,或者一个四原创 2015-06-29 11:57:07 · 2117 阅读 · 0 评论 -
C++ 中 new 操作符内幕:new operator、operator new、placement new
一、new 操作符(new operator)人们有时好像喜欢故意使C++语言的术语难以理解。比如说new操作符(new operator)和operator new的区别。 当你写这样的代码:string *ps = new string("Memory Management");你使用的new是new操作符。这个操作符就象sizeof一样是语言内置的,你不能改变它的含义,它的功能总原创 2015-06-30 15:50:04 · 1248 阅读 · 0 评论 -
explicit 构造函数
一、构造函数、默认构造函数、合成的默认构造函数构造函数,是函数名与类名相同、没有返回类型的特殊的成员函数。可以有初始化列表。默认构造函数,没有形参,或所有形参都有默认实参的构造函数。如果没有显示定义任何构造函数,编译器会自动创建合成的默认构造函数。一个类哪怕只定义了一个构造函数(不管是不是默认构造函数),编译器也不会再生成默认构造函数。合成的默认构造函数使用与变量初始化相同原创 2015-07-01 23:26:18 · 1697 阅读 · 0 评论 -
读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
原文链接:C语言结构体里的成员数组和指针复制如下:单看这文章的标题,你可能会觉得好像没什么意思。你先别下这个结论,相信这篇文章会对你理解C语言有帮助。这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接。微博截图如下。我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章。为了方便你把代码copy过去编译和调试,我把代码列在下原创 2015-07-09 23:10:18 · 1336 阅读 · 0 评论 -
引用,引用形参,指针形参与指向指针的引用形参,内存泄露及free相关
由做UVa133引发的一系列问题及讨论1.引用类型 C++ Primer P51引用就是对象的另一个名字,使用多个变量名指向同一地址。实际程序中,引用主要用作函数形参。复合类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。格式: 类型名& 标示符=已声明的常变量;2.引用形参 C++ Primer P201-205非引用形参有普通的、指针形参、con原创 2014-05-06 00:50:35 · 1948 阅读 · 0 评论 -
转换与继承
一、概述每个派生类对象包含一个基类部分,这意味着可以像使用基类对象一样在派生类对象上执行操作。因为派生类对象也是基类对象,所以存在从派生类类型引用到基类类型引用的自动转换;即,可以将派生类对象的引用转换为基类子对象的引用,对指针也类似。基类类型对象既可以作为独立对象存在,也可以作为派生类对象的一部分存在。因此,一个基类对象可能是、也可能不是一个派生类对象的部分,所以,没有从基类引用原创 2015-07-22 21:50:12 · 677 阅读 · 0 评论 -
C和C++中的const
一、C语言和C++中的constconst 在 C 语言中是只读变量,总是占用存储空间。C 编译器不能把它看成一个编译期的常量,所以把它用于数组定义时的大小会出现问题。C默认const是外部连接。C++中,一个const不必创建内存空间,C++编译器把这个定义保存在它的符号表里。C++默认const是内部连接。有些情况下,C++还是会为const常量创建内存空间,比如把它定原创 2015-09-14 10:28:36 · 538 阅读 · 0 评论 -
C++ 初始化形式、变量初始化规则、类构造函数的初始化列表
类构造函数的初始化列表,举例一个对象的构造分两部分,首先是分配空间,然后初始化。只要有对象生成,不管是以什么形式生成,都会调用构造函数进行初始化。然后下面有个例子,在蓝色区域Big类的复制构造函数中,使用初始化列表进行成员的初始化(方法1)没有问题,而如果不使用初始化列表、直接在函数里用里面注释掉的代码(方法2)则会报错:Base类没有合适的构造函数。// W3-课程作业2-4原创 2015-04-24 22:55:35 · 2261 阅读 · 0 评论 -
PKU C++程序设计实习 学习笔记5 文件操作和模板
第七章 文件操作和模板7.1 文件操作7.2 函数模板泛型程序设计(Generic Programming)算法实现时不指定具体要操作的数据的类型泛型——算法实现一遍,适用于多种数据结构优势: 减少重复代码的编写两种类型函数模板类模板与“抽象、封装、继承、多态”并列函数模板template原创 2015-05-06 23:08:49 · 1213 阅读 · 0 评论 -
关于while循环中的~scanf()
可以经常在ACM代码中看到 while(~scanf("%d",&n)){ } 这样的代码,意思是在读到输入结尾时循环也结束。一般在读到输入流结尾时,scanf返回的是EOF。EOF是在头文件stdio.h中定义的常量,一般为-1。-1 的原码是10000001,反码是1111110,补码是11111111。复习一下,正数的原码、反码、补码都是一样的;负数的原码是符号位为1,反码是(对原创 2014-08-30 23:18:08 · 12856 阅读 · 4 评论 -
C 语言中的左值和右值。以及对比数组名和指针取数组元素的区别。
左值:出现在赋值符左边的符号有时称为左值。右值:出现在赋值符右边的符号有时称为右值。编译器为每个变量分配一个地址(左值),这个地址在编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量值并将它存于寄存器。可以看到,每个符号的地址在编译时可知。对比一下几个式子://常原创 2014-10-31 20:48:25 · 1422 阅读 · 0 评论 -
assert 用法总结
原型assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression );作用assert的作用是计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badp转载 2015-03-27 17:19:38 · 573 阅读 · 0 评论 -
new/delete 和 malloc/free 的区别
1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。但是new能够自动分配空间大小,而malloc需要计算字节数。2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,原创 2015-04-18 11:06:23 · 836 阅读 · 0 评论 -
PKU C++程序设计实习 学习笔记1
1.7 内联函数和重载函数内联函数:函数调用是有时间开销的。如果函数本身只有几条语句,执行非常快,而且函数被反复执行很多次,相比之下调用函数所产生的这个开销就会显得比较大。为了减少函数调用的开销,引入了内联函数机制。编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句。重载函数:一个或多个函数,名字相同,然而参数个数或参数类型不相同,这原创 2015-04-19 18:06:18 · 1243 阅读 · 0 评论 -
位运算
位运算位运算:用于对整数类型(int,char, long 等)变量中的某一位(bit),或者若干位进行操作。比如:1) 判断某一位是否为12) 只改变其中某一位,而保持其他位都不变。C/C++语言提供了六种位运算符来进行位运算操作:& 按位与(双目) | 按位或(双目)^ 按位异或(双目)~ 按位非(取反)(单目)>>原创 2015-04-19 15:23:10 · 1190 阅读 · 0 评论 -
const 关键字
原创 2015-04-19 16:43:27 · 723 阅读 · 0 评论 -
北大程序设计实习公开课编程作业,魔兽世界之一:备战
魔兽世界的第一个版本,备战。比较简单。因为我 take 这个课的时候,课程已经开到第八周了,这些作业已经不能提交。所以该代码没有提交通过 oj 判断,需要大家注意一下。如果以后有人拿此代码交了,没有AC,希望能告诉下。(另外,这里我想熟悉下 VS 环境,所以代码都是在 VS2013 里写的,提交之前可能需要注释掉 #include "stdafx.h",以及 main 函数的参数表和函数名可能原创 2015-04-23 10:26:34 · 5092 阅读 · 1 评论 -
北大程序设计实习公开课编程作业,魔兽世界之二:装备
魔兽世界的第二个版本,装备。相较于版本一,武士已经不能直接用两个全局数据保存名称和初始生命值就可以搞定了。这里先分析一下题目。武士有5个种类,每种都有自己的特征,但他们共有的特征是有名字和生命元这两个属性。所以把这两个共有属性抽象出来作为一个基类warrior。5种武士分别从这个基类派生。逻辑上,“一个XX武士就是一个warrior”,是合理的;所以的确是继承关系。由于wolf武士没有特殊原创 2015-04-23 10:40:28 · 2840 阅读 · 2 评论 -
PKU C++程序设计实习 学习笔记2 继承与派生
第五章 继承与派生5.1 继承和派生继承和派生的概念继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称子类)。派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。派生类一经定义后,可以独立使用,不依赖于基类。派生类拥有基类的全部成员函数和成原创 2015-04-22 11:34:12 · 1025 阅读 · 0 评论 -
PKU C++程序设计实习 学习笔记3 多态与虚函数
第六章 多态与虚函数6.1 多态和虚函数的基本概念引言多态是面向对象程序设计里面非常重要的这个机制。它能很有效的提高程序的可扩充性。有些程序设计语言有被对象继承的概念,但是没有多态的概念,那这样的程序设计语言只能被称作基于对象的程序设计语言,而不能称为面向对象的语言, 比方说visual basic。虚函数在类的定义中,前面有 virtual 关键字的成员函数就是虚函数原创 2015-04-23 14:25:48 · 1383 阅读 · 0 评论 -
引用
引用的概念下面的写法定义了一个引用,并将其初始化为引用某个变量。类型名 & 引用名 = 某变量名;int n = 4;int & r = n; // r引用了 n, r的类型是 int &某个变量的引用,等价于这个变量,相当于该变量的一个别名。示例程序:int n = 4;int & r = n;r = 4;cout << r; //输出4cout << n; //原创 2015-04-19 16:11:58 · 941 阅读 · 0 评论 -
二维数组名作形参
之前帮同学调一个程序的时候遇到的,把二维数据改为全局变量,不通过参数传递就没问题了,否则程序崩溃。细究一下,二维数据名用于形参时需要注意哪些方面。测试程序如下:#include#includevoid print1(int **a, int m, int n);void print2(int (*a)[2], int m, int n);int main(){ int原创 2015-04-17 22:40:39 · 811 阅读 · 0 评论