
c/c++
文章平均质量分 53
爱橙子的OK绷
时刻准备着。。。
展开
-
linux下使用c++创建守护进程
#include<stdio.h> #include<stdlib.h>#include<string>#include<iostream原创 2017-01-03 11:50:59 · 4640 阅读 · 0 评论 -
《c专家编程》学习笔记(二)
1、虚拟内存虚拟内存的基本思路是使用廉价但缓慢的磁盘来扩充快速但昂贵的内存。操作系统负责具体细节,使得每个进程都以为自己拥有整个地址空间的独家访问权,这个幻觉依靠虚拟内存实现。所有进程共享机器的物理内存,当内存用完时就用磁盘保存数据。在进程运行时,数据在磁盘和内存之间来回移动。内存管理硬件负责把虚拟地址翻译为物理地址,并让一个进程始终运行于系统的真实内存中。应用程序程序员只看到虚拟地址,并不知道自己原创 2016-05-16 10:21:37 · 520 阅读 · 0 评论 -
strcpy、memcpy、strncpy函数实现
已知strcpy函数的原型是:char *strcpy(char *dst, const char *src);1、实现strcpy函数 2、解释为什么要返回char * 3、假如考虑dst和src内存重叠的情况,strcpy该怎么实现1.strcpy的实现代码#include <iostream>#include<string.h>#include<assert.h>using name转载 2016-04-14 22:37:04 · 621 阅读 · 0 评论 -
static_cast,dynamic_cast,reinterpret_cast和const_cast
C-style cast举例 int i; double d; i = (int) d;上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d本身的值并没有发生改变)。这就是典型的c-style类型转换。下面一个简单程序:#include <iostream>using namespace std;int main(){转载 2016-03-24 17:22:58 · 388 阅读 · 0 评论 -
给定一个仅包含'A'-'Z'的字符串,表示成'kX'形式输出
问题描述:给定一个仅包含’A’-’Z’的字符串,用下面的方法进行编码: (1)每个包含k个相同字符的子串要表示成”kX”,其中X是由唯一字符组成的子串。(2)如果某个子串的长度为1,则1忽略不写。 输入:第1行输入一个整数N(1<=N<=100) ,代表要处理的字符串的个数。接下来的N行就分别输入一个只包含’A’-’Z’的字符串,每个字符串的长度小于10000. 输出:对于每个字符串,在单独的原创 2016-03-23 20:19:16 · 4316 阅读 · 0 评论 -
c/c++题目汇总一
1、引用可以是void类型吗?正确答案: A A、不可以 B、可以void类型没有分配内存,而引用必须是另一个固定内存变量的别名,所以不能指向void。引用必须初始化,有类型。2、请问在64位平台机器下sizeof(string_a),sizeof(string_b)大小分别是() 1.char *string_a=(char *)malloc(100*sizeof(ch原创 2016-02-19 20:48:16 · 1830 阅读 · 1 评论 -
C++智能指针简单剖析
1. 智能指针背后的设计思想我们先来看一个简单的例子:void remodel(std::string & str){ std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; delete ps; re转载 2016-03-07 11:22:43 · 387 阅读 · 0 评论 -
c++异常处理机制
一、 概述C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制。C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句,函数,结构和类,致使编译程序无法进行。另一种是运行时发生的错误,一般与算法有关。 关于语法错误,不必多说,写代码时心细一点就可以解决。C++编译器的报错机制可以让我们轻松地解决这些错误。 第二种是运行时的错误,常见的有文件打开失败、数组下标溢转载 2016-02-19 15:50:59 · 626 阅读 · 0 评论 -
中缀表达式转后缀表达式的方法
平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2"叫做中缀表达式。因为所有的运算符号都在两数字的中间。将该中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+”,如何做到呢?规则如下:1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出原创 2016-03-16 18:07:39 · 496 阅读 · 0 评论 -
realloc,malloc,calloc三者的区别
malloc,calloc,realloc,free属于C函数库,而new/delete则是C++函数库;多个-alloc的比较alloc:唯一在栈上申请内存的,无需释放;malloc:在堆上申请内存,最常用;calloc:malloc+初始化为0;realloc:将原本申请的内存区域扩容,参数size大小即为扩容后大小,因此此函数要求size大小必须大于ptr内存大小。realloc,ma原创 2016-03-16 16:52:56 · 418 阅读 · 0 评论 -
C和C++中的存储区域(栈、堆、全局...)
一、预备知识——程序的内存分配: 一个由c/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,转载 2015-09-25 21:39:32 · 405 阅读 · 0 评论 -
你会解吗? ?+?+?=30 把下面数字填到框里 (1,3,5,7,9,11,13,15)
以下程序转自知乎#include <iostream>#include <stdio.h>using namespace std;int main(){ for(int base = 9 ; base <= 19; base++) {//数字到9,所以最小是9进制 int number[8] = {1, 3, 5, 7, 9, base + 1, base + 3, b转载 2015-10-09 23:03:25 · 22523 阅读 · 0 评论 -
《More Effective C++》读书笔记-基础议题
一、仔细区别 pointers 和 references1)引用不可以为空(必须指向某个对象),而指针可以为空。 引用带来的好处:不需要检查空引用,也就省了相应的处理代码 指针在使用前则需要判断是否为空,对应两种处理逻辑。 2)引用必须要初始化,而指针不是必要的(但最好初始化)。 3)指针可以被重复赋值,指向另一个对象;引用总是指向(代表)它最初获得的那个对象。 4)重载某个操作符(例如o原创 2016-04-30 14:56:26 · 454 阅读 · 0 评论 -
《More Effective C++》读书笔记-异常
9、利用destructors 避免泄漏资源使用指针时,如果在delete指针之前产生异常,将会导致不能删除指针,从而产生资源泄漏。解决办法: 1、使用try-catch语句。int *pi = new int[10000];std::cout<<pi<<std::endl;try{ func();//若此处异常而未处理,无法执行delete语句,造成内存泄漏}catch(std原创 2016-04-30 19:24:30 · 517 阅读 · 0 评论 -
c++中ifstream,ofstream和fstream的使用方法
一、C++中IO库类型c++中的IO库类型和头文件如下: 各种IO库类型对应的继承关系为:类型ifsream和istringstream都继承自istream;类型ofsream和ostringstream都继承自ostream;类型fsream和stringstream都继承自iostream;继承机制的特点就是可以讲一个派生类对象当作基类对象来使用。因此我们可以像使用istream对象原创 2016-12-22 17:45:00 · 47810 阅读 · 3 评论 -
c++读取以逗号为分隔符的一串数字
#include<iostream>#include<vector>#include<sstream>using namespace std;int main(){ string s; vector<int> v; getline(cin, s); istringstream is(s); int inter; char ch; whi原创 2016-09-17 22:09:00 · 19883 阅读 · 0 评论 -
《Exceptional c++》和《提高c++性能的编程技术》学习笔记
1、c++临时对象创建对象是一个费时,费空间的操作,会产生临时对象的几种情况:1)以值的方式给函数传参 按值传递时,首先将需要传给函数的参数,调用拷贝构造函数创建一个副本,所有在函数里的操作都是针对这个副本的,也正是因为这个原因,在函数体里对该副本进行任何操作,都不会影响原参数。指导原则:在传递函数参数时,选择以常量引用的方式,而不是传值方式。2)类型转换 我们在做类型转换时,转换后的对象通常原创 2016-06-10 12:19:51 · 881 阅读 · 0 评论 -
《深度探索c++对象模型》学习笔记
1、c++的布局和存取时间成本?封装并未给c++带来任何的空间或执行期的不良后果,c++在布局和存取时间上的主要额外负担由虚拟化引起。包括: 1)virtual function机制。用以支持一个有效率的“执行期绑定”。 2)virtual base class机制。用以实现“多次出现在继承体系中的base class,有一个的单一而被共享的实例”。2、虚拟继承虚拟继承是多重继承中特有的概念。虚原创 2016-05-31 15:48:51 · 2448 阅读 · 0 评论 -
《c专家编程》学习笔记(一)
1、typedef和#define的区别1、typedef:typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间。可以增强程序的可读性,以及标识符的灵活性。2、#define:#define为宏定义语句,是预处理指令。通常用来定义常量(包括无参量与带参量)。它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及原创 2016-05-14 23:02:15 · 1832 阅读 · 0 评论 -
《More Effective C++》读书笔记-操作符
五、谨慎定义类型转换函数1)定义类似功能的函数,而抛弃隐式类型转换,使得类型转换必须显示调用。例如 String类没有定义对Char*的隐式转换,而是用c_str()函数来实施这个转换。 2)拥有单个参数(或除第一个参数外都有默认值的多参数)构造函数的类,很容易被隐式类型转换,最好加上 explicit 防止隐式类型转换。六、自增和自减操作符前缀与后缀形式的区别1、后缀式operator++(in原创 2016-04-30 16:15:12 · 378 阅读 · 0 评论 -
自己实现String类
#include <iostream>#include<string.h>using namespace std;class String{public: String(const char *str = NULL);// 普通构造函数 String(const String &other); // 拷贝构造函数 ~String(); // 析构函数转载 2016-04-19 17:10:54 · 495 阅读 · 0 评论 -
const_iterator与const iterator区别
#include <iostream>#include<vector>using namespace std;int main(){ vector<int> vec; //(1)const_iterator它自身的值可以改(可以指向其他元素),但不能改写其指向的元素值. //即只能用于读取容器内的元素,但不能改变其值。 vector<int>::const_it原创 2016-04-18 17:55:48 · 1222 阅读 · 0 评论 -
《More Effective C++》读书笔记-技术(二)
30、proxy classes(代理类)可以用两个类来实现二维数组:Array1D是一个一维数组,而Array2D则是一个Array1D的一维数组。Array1D的实例扮演的是一个在概念上不存在的一维数组,它是一个代理类。代理类最神奇的功能是区分通过operator[]进行的是读操作还是写操作,它的思想是对于operator[]操作,返回的不是真正的对象,而是一个 proxy类,这个代理类记录了对原创 2016-05-02 15:28:58 · 578 阅读 · 0 评论 -
《More Effective C++》读书笔记-技术
25、将构造函数和非成员函数虚化1、这里所谓的虚拟构造函数,并不是真的指在构造函数前面加上 virtual 修饰符,而是指能够根据传入不同的参数建立不同继承关系类型的对象。class NLComponent { // 抽象基类,其中内含至少一个纯虚函数public:...};class TextBlock: public NLComponent{ // 没有内含任何纯虚函数public:原创 2016-05-02 12:27:49 · 3980 阅读 · 0 评论 -
《More Effective C++》读书笔记-效率
条款16-18省略。19、了解临时对象的来源临时对象产生的两种条件:1、为了使函数成功调用而进行隐式类型转换时。 2、函数返回对象时。临时对象是有开销的,因此要尽可能去消除它们,然而更重要的是训练自己寻找可能建立临时对象的地方,在任何时候只要见到常量引用参数,就存在建立临时对象而绑定在参数上的可能性,在任何时候只要见到函数返回对象,就会有一个临时对象被建立(以后被释放)。20、协助完成返回值优化略原创 2016-04-30 23:10:01 · 736 阅读 · 0 评论 -
函数指针与模板的通用之处
要求a与b之和,c与d之差。。。等等,我们可以单独为他们设置一个函数,但是如果函数功能改变,则需要重写,缺少灵活性。而函数指针与模板提供了极大地便利。一、函数指针一个函数在编译时被分配一个入口地址,这个入口地址称为函数指针,就如同指针是一个变量的地址一样。函数指针的用途很多,最常用的就是把指针作为参数传递到其他函数。#include <iostream>using namespace std;int原创 2015-10-08 10:32:08 · 435 阅读 · 0 评论 -
泛型编程
一、泛型泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是转载 2015-10-04 23:48:03 · 460 阅读 · 0 评论 -
漫谈C指针第九讲---参数的值传递
1、值传递的一个错误认识先看考题一中Exchg1函数的定义:void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数 */{ int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d.\n", x, y);}问:你认为这个函数是在做什么呀?答:好像是转载 2015-09-06 21:16:35 · 381 阅读 · 0 评论 -
漫谈C指针第十讲---参数的地址传递
看考题二的代码:#include "stdio.h"void Exchg2(int *px, int *py){ int tmp = *px; *px = *py; *py = tmp; printf("*px = %d, *py = %d.\n", *px, *py);}main(){ int a = 4; int b = 6; Ex转载 2015-09-06 21:27:00 · 438 阅读 · 0 评论 -
漫谈C指针第六讲---从 const int i 说起
从const int i 说起你知道我们声明一个变量时象这样int i ;这个i是可能在它处重新变赋值的。如下:int i = 0;/* . . . */i = 20; /*这里重新赋值了*/不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值。之后我的程序在其它任何处都不会再去重新对它赋值。那我又应该怎么办呢?用const 。/* . . . */const int转载 2015-09-05 12:04:14 · 481 阅读 · 0 评论 -
漫谈C指针第七讲---const int *pi 的语义
我先来说说const int *pi是什么作用 (当然int const *pi也是一样的,前面我们说过,它们实际是一样的)。看下面的例子:#include "stdio.h"main(){ /* 代码开始 */ int i1 = 30; int i2 = 40; /* 现在 pi 变量的内容为 i1 的内存地址 */ const int *pi = &i1转载 2015-09-05 15:02:15 · 683 阅读 · 0 评论 -
漫谈C指针第四讲---指针与数组
通过数组名访问数组元素看下面代码:int i, a[] = {3,4,5,6,7,3,7,4,4,6};for (i = 0; i <= 9; i++){ printf("%d\n", a[i]);}很显然,它是显示a 数组的各元素值。我们还可以这样访问元素,如下:int i, a[] = {3,4,5,6,7,3,7,4,4,6};for (i = 0; i <= 9; i++)转载 2015-09-05 11:39:30 · 366 阅读 · 0 评论 -
漫谈C指针第五讲---声明指针常量
请再看下面的代码:#include "stdio.h"main(){ int i, a[] = {3,4,5,6,7,3,7,4,4,6}; int *const pa = a; /* 注意const的位置:不是const int *pa */ for (i = 0; i <= 9; i++) { printf("%d\n", *pa);转载 2015-09-05 11:51:53 · 380 阅读 · 0 评论 -
漫谈C指针第三讲---指针是什么东西
指针,想说弄懂你不容易啊!我们许多初学指针的人都要这样感慨。我常常在思索它,为什么呢?其实生活中处处都有指针,我们也处处在使用它。有了它我们的生活才更加方便了。没有指针,那生活才不方便。不信?你看下面的例子。这是一个生活中的例子:比如说你要我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的2层3号的书架上,并写了一张纸条放在你的桌上。纸条上写着:你要的书在第2层3号的书架上。当你回来转载 2015-09-02 17:44:42 · 668 阅读 · 0 评论 -
漫谈C指针第二讲---变量赋值与取地址
赋值给变量再看下面赋值:i = 30;a = 't';你当然知道个两个语句是将30存入i变量的内存空间中,将“t”字符存入a变量的内存空间中。我们可以利用这样的形象来理解: 变量在哪里?即我想知道变量的地址。好了,接下来我们来看看&i是什么意思?是取i变量所在的地址编号嘛。我们可以这样读它:返回i变量的地址编号。你记住了吗?我要在屏幕上显示变量的地址值的话,可以写如下代码:printf("%x"转载 2015-09-02 17:06:19 · 811 阅读 · 0 评论 -
漫谈C指针第一讲---C语言变量的实质
要理解C指针,我认为一定要理解C中“变量”的存储实质,所以我就从“变量”这个东西开始讲起吧。先来理解理解内存空间吧。请看下图: 如上图所示,内存只不过是一个存放数据的空间,就好像我的看电影时的电影院中的座位一样。电影院中的每个座位都要编号,而我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧。所以内存也要象座位一样进行编号了,这就是我们所说的内存编址。座位可以是遵循“一个转载 2015-09-02 16:44:09 · 501 阅读 · 0 评论 -
漫谈C指针第十一讲---参数的引用传递
看题三的代码:#include <iostream>using namespace std;void fun(int& x, int& y){ int t = x; x = y; y = t; cout<<"x="<<x<<endl; cout<<"y="<<y<<endl;}int main(){ int a = 4; int b=6;转载 2015-09-08 09:22:11 · 383 阅读 · 0 评论 -
c/c++内存泄露
一、内存泄露原因忘记释放或释放失败申请的已经不再使用的内存,从而导致内存泄露。二、内存泄露类型c/c++没有垃圾回收机制(Garbage Collection),主要关注其两种类型的内存泄露问题:堆内存泄漏(Heap leak) 堆内存指程序运行中根据需要分配通过malloc,calloc,realloc,new等从堆中分配的一块内存,并且完成后须通过调用对应的 free或delete 释放。如原创 2015-08-04 15:58:28 · 817 阅读 · 0 评论 -
漫谈C指针第八讲---参数传递的三道题目
考题一,程序代码如下:#include "stdio.h"void Exchg1(int x, int y){ int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d\n", x, y);}int main(){ int a = 4,b = 6; Exchg1(a, b);转载 2015-09-06 13:46:47 · 397 阅读 · 0 评论 -
漫谈C指针第十二讲---回顾指针概念
早在前面我就对指针的实质进行了阐述。今天我们又要学习一个叫做“指向另一指针地址”的指针。让我们先回顾一下指针的概念吧。当我们程序如下声明变量:short int i;char a;short int * pi;程序会在内存某地址空间上为各变量开辟空间,如下图所示: 图中所示中可看出:i 变量在内存地址5的位置,占2个字节。 a变量在内存地址7的位置,占1个字节。 pi变量在内存地址9的位置转载 2015-09-08 09:36:44 · 416 阅读 · 0 评论