![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 67
Rock_N_Roll_
想成为一个摇滚文艺码农
展开
-
对象移动
左值和右值概念: 当一个对象被用作右值的时候,用的对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。一个重要的原则:在需要右值的地方可以用左值代替,但是不能把右值当做左值使用。当一个左值被当做右值使用时,实际使用的是它的内容。几种熟悉运算符的左右值情况:使用关键字decltype的时候,如果表达式的求值结果是左值,则decltype作用于该表达式得到的是一个引用类型。右原创 2017-02-02 22:08:01 · 310 阅读 · 0 评论 -
拷贝控制与资源管理
管理类外资源的类必须定义拷贝控制成员。为了定义这些成员,我们必须确定此类型的拷贝语义。 类的行为可以定义为类值行为或类指针行为。类值行为:类的行为像一个值,当我们拷贝一个像值的对象时,副本和原对象是完全独立的。以HasPtr类为实例(C++primer P453),为了实现类值行为,我们需要 (1)定义一个拷贝构造函数,完成string的拷贝,而不是拷贝指针 (2)定义一个折构函数来释放stri原创 2017-01-22 15:20:01 · 299 阅读 · 0 评论 -
模板与泛型编程之定义模板
函数模板:template <typename T>//模板参数列表int compare(const T &v1,const T &v1)//模板参数{ if(v1<v2) return -1; if(v2<v1) return 1; return 0;}当我们调用一个函数模板时,编译器用函数实参来为我们推断模板实参。cout<<compare(1,0);//实例化为原创 2017-02-14 21:43:10 · 447 阅读 · 0 评论 -
深入理解虚函数
前言在C++中,在基类中被声明为virtual并在在一个或多个派生类中被重新定义的成员函数就是虚函数。基本格式如下:virtual (return_type) (func_name) (arg) {function body;}我们可以通过指向派生类的基类指针或引用来调用派生类中同名覆盖的成员函数。如下代码:class A{ public: virtual void pri原创 2017-07-20 12:40:00 · 289 阅读 · 0 评论 -
const 用法
规则:如果关键字const出现在星号左边,表示所指内容是常量。如果出现在星号的右边,表示指针本身是常量(内存的地址不变)。如果出现在星号的两边,表示被指物和指针两者都是常量。char a[]="hello";char *p=a;//non-const pointer,non-const dataconst char* p=a;//non-const pointer,const datachar原创 2017-02-17 10:30:50 · 233 阅读 · 0 评论 -
realloc函数用法
函数原型:void *realloc(void *ptr, size_t size);功能: 重新分配大小为size的一块内存,返回内存地址ptr。函数源码流程图:使用方法:/* realloc example: rememb-o-matic */#include <stdio.h> /* printf, scanf, puts */#include <stdlib.h> /原创 2017-07-14 20:45:20 · 969 阅读 · 0 评论 -
C语言中巧用正则表达式 regex_t
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。C语言处理正则表达式常用的函数有regcomp()、regexec()、regfree()和regerror(),一般分为三个步骤,如下所示:C语言中使用正则表转载 2017-07-13 19:54:20 · 445 阅读 · 0 评论 -
深入理解extern "C" 的使用
前言最近用到了动态库的函数dlsym函数,其作用是返回指定符号函数的地址。详见 深入理解Linux动态库和静态库http://blog.csdn.net/u013616945/article/details/75151418但由于动态库文件是C++写的,如果函数不加extern “C” 符号的话,在编译的时候回提示找不到dlsym函数指定符号的函数。下面就总结extern “C”的使用。C++原创 2017-07-18 21:28:23 · 2195 阅读 · 0 评论 -
C++ 虚函数表解析
C++ 虚函数表解析 陈皓http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数转载 2017-03-05 13:38:40 · 228 阅读 · 0 评论 -
数字追赶--搜狐笔试题
题目如下://下面的for循环分别循环了几次。1.unsigned short i,j;for(i=0, j=2; i!=j; i+=5, j+=7){}2.unsigned short i,j;for(i=3,j=7;i!=j;i+=3,j+=7){}分析: 题目1:unsigned short 可以表示为2的16次方个数,其数的范围为0到2的16次方-1,在题目1中,j比i大2,原创 2017-07-31 17:33:39 · 223 阅读 · 0 评论 -
深入理解计算机系统之数据的表示与存储
前言在编写程序的时候,不同数据类型进行转换和计算的时候总是可能出现各种各样奇怪的bug,所以深入的了解计算机系统中数据的表示与存储有利于我们编写高效与健壮的计算机程序,本文主要总结计算机系统中整数,浮点数的表示和存储。真值与补码的相互转换真值指的就是现实当中的正负数,而补码是计算机中表示真值的一种编码方式,也就是0/1编码的序列。补码与真值的关系如下: 其中n表示机器的字长,X是真值。求真值的补原创 2017-08-02 18:10:22 · 1919 阅读 · 0 评论 -
由重建二叉树算法题到临时对象不能绑定到非 const 的左值引用
前言最近再刷剑指offer,在将一个临时变量传给一个引用的时候,出现了non-const lvalue reference to type 'vector<[...]>' cannot bind to a temporary of type 'vector<[...]>'的错误,意思就是不能将临时对象绑定到非const的左值的引用,那么在这里就总结一下这道算法题,const引用的用法。const总结原创 2017-07-25 20:13:15 · 920 阅读 · 0 评论 -
构造函数与折构函数调用顺序
构造函数先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下: 1.基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序,而不是它们在成员初始化表中的顺序。 2.成员类对象构造函数。如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序,而不是它们出现在成员初始化表中的顺序。 3.转载 2017-03-13 00:20:48 · 641 阅读 · 0 评论 -
c++继承中的内存布局
c++继承中的内存布局(转)今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。——谈VC++对象模型(美)简.格雷程化 译译者前言一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的转载 2017-09-22 10:43:57 · 503 阅读 · 0 评论 -
泛型算法
插入迭代器 back_inserter: back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器。当我们通过此迭代器赋值时,赋值运算符会调用push_back将一个具有给定的元素添加到容器中。定义在头文件iterator中。vector<int> vec;auto it=back_inserter(vec);//返回一个插入迭代器*it=42;//赋值调用push_原创 2017-02-21 10:02:34 · 292 阅读 · 0 评论 -
拷贝,赋值与销毁
拷贝控制操作基本概念: 拷贝定义了当用同类型的另一个对象初始化本对象时做什么。 赋值定义了将一个对象赋予同类型的另一个对象时做什么。 折构定义了当此类型对象销毁时做什么。拷贝构造函数:如果一个构造函数的第一个参数是自身类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。 合成拷贝函数:如果我们没有为类定义拷贝构造函数,编译器会为我们定义一个。编译器会从指定对象中依次将每个非st原创 2017-01-21 22:02:37 · 263 阅读 · 0 评论 -
操作重载
重载的运算符是具有特殊名字的函数。它们的名字由关键字operator和其后要定义的运算符号共同组成。当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的参数数量比运算对象少一个。 不能被重载的运算符有(::) (.* )(. )(?:) 不应该被重载的运算符: 逻辑运算符,逗号运算符,取地址运算符 选做成员函数的运算符: =,[ ],( ), ->, 符合赋值+=,原创 2017-02-04 22:24:49 · 216 阅读 · 0 评论 -
函数调用运算符与重载、类型转换
函数调用运算符:operator() 函数运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或类型上有所区别。如果类定义了调用运算符,则该类的对象称作函数对象。 函数对象类除了operator之外还可以包含其他成员。这些成员通常用于定制调用运算符中的操作。#include <iostream>#include <string>class A{public原创 2017-02-05 15:11:36 · 461 阅读 · 0 评论 -
面向对象程序设计之基类,派生类与虚函数
面向对象程序设计的核心思想是:数据抽象:实现类与接口的分离。继承:定义相似类型并进行相似关系建模。通过继承联系在一起的类构成一种层次关系。通常在在层次关系的根部有一个基类,其他类直接或间接由基类继承而来。这些继承的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时的基类就将这些函数声明成虚函数。cl原创 2017-02-06 14:41:47 · 2968 阅读 · 0 评论 -
面向对象程序设计之访问控制、继承与拷贝控制
访问控制与继承: 一个类使用protected关键字来声明那些希望与派生类分享但是不想被其他公共访问的成员。其性质如下: (1)和私有成员类似,受保护的成员对类的用户是不可访问的 (2)和公有成员类似,受保护的成员对于派生类的成员和友元来时是可访问的。 (3)派生类的成员或友元只能通过派生类对象来访问 基类的受保护成员。派生类对于一个基类对象中的受保护成员没有任何访问特权。某个类对其继承而原创 2017-02-07 21:58:37 · 295 阅读 · 0 评论 -
模板与泛型编程之模板实参推断
模板实参推断过程中允许对函数实参进行的两种类型转换: (1) const 转换:可以将一个非const对象的引用(或指针)传递给一个const的引用(或指针)形参。 (2)数组或函数指针转换:如果函数形参不是引用类型,则可以对数组或函数类型的实参应用正常的指针转换。一个数组实参可以转换为一个指向其首元素的指针。类似的,一个函数实参可以转换为一个函数类型的指针。函数模板可以由用普通类型定义的参数。原创 2017-02-16 15:11:06 · 405 阅读 · 0 评论 -
new和delete管理内存
C++语言定义了两个运算符来分配和释放动态内存。运算符new分配内存,delete释放new分配的内存。在自由空间分配的内存是无名的,因此new无法为其分配的对象命名,而是返回一个指向该对象的指针。默认情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型的对象的值将是未定义的,而类类型将用默认构造函数进行初始化,对动态分配的对象进行初始化通常是必要的:string *ps=new str原创 2017-01-17 23:41:03 · 274 阅读 · 0 评论 -
顺序容器
顺序容器类型:tip:通常使用vector是最好的选择。容器操作:容器定义和初始化:当将一个容器初始化为另一个容器的拷贝时,两个容器的容器类型和元素类型都必须相同。当传递迭代器参数来拷贝一个范围,就不要求容器类型是相同的,容器赋值运算:向顺序容器添加元素:使用emplace操作:当我们调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emp原创 2017-02-17 12:40:23 · 192 阅读 · 0 评论 -
智能指针-shared_ptr类
shared_ptr是模板,允许多个指针指向同一个对象,定义时需提供指针可以指向的类型,如:shared_ptr<string> p1;//shared_ptr,可以指向stringshared_ptr<list<int>> p2;//shared_ptr,指向int的listshared_ptr和unique_ptr常见的操作如下:shared_ptr独有的操作如下: 最安全的分配原创 2017-01-17 22:39:38 · 325 阅读 · 0 评论 -
IO库
IO库类型和头文件:我们不能对IO对象进行拷贝和赋值,所以进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const.文件输入输出:fstream特有的操作:对一个已经打开的文件流调用open会失败,并会导致failbit被置位。为了将文件流关联到另外一个文件,必须首先关闭已经关联的文件。一旦文件成功关闭,我们可以打开新的文件。当一个fstrea原创 2017-02-18 12:30:56 · 307 阅读 · 0 评论 -
unique_ptr和weak_ptr
一个unique_ptr拥有它所指向的对象,当我们定义一个unique_ptr时,需要将其绑定到一个new返回的指针,unique_ptr不支持普通的拷贝与赋值操作。 unique_ptr的release 和reset函数用法:unique_ptr传递自己的删除器,如下:weak_ptr是一种 不控制所指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象,其操作:使用例子如原创 2017-01-19 13:53:13 · 277 阅读 · 0 评论 -
动态数组
使用new分配动态数组得到是一个元素类型的指针,即动态数组的第一个元素,并非一个数组类型的对象。用法如下:我们可以使用unique_ptr(shared_ptr)来管理动态数组,用法如下:allocator类将内存分配和对象构造分离开,其用法如下:allocator的伴随算法:原创 2017-01-19 15:48:44 · 243 阅读 · 0 评论 -
关联容器--map和set
map是关键字-值对的集合。关键字起到了索引作用,值则表示与索引相关的数据。set则只是关键字的集合,支持高效的关键字查询操作。使用map的实例程序如下: map<string,std::size_t> word_count;//定义一个string到size_t的map set<string> exclude={"the","but","and","or","an","a"};//原创 2017-01-19 17:50:48 · 255 阅读 · 0 评论 -
c++ primer之变量与基本类型
如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果。因为带符号数会自动转换成无符号数。unsigned u=10;int i=-42;std::cout<<i+i<<std::endl;//输出-84std::cout<<u+i<<std::endl;//如果int占32位,输出4294967264引用与指针:引用并非对象,引用只是为一个已经存在的对象所起的另外一个原创 2017-02-20 10:56:13 · 342 阅读 · 0 评论 -
C++ 顺序容器基础知识总结
转载自:http://www.cnblogs.com/QG-whz/p/5152963.html正文0.前言本文简单地总结了STL的顺序容器的知识点。文中并不涉及具体的实现技巧,对于细节的东西也没有提及。一来不同的标准库有着不同的实现,二来关于具体实现《STL源码剖析》已经展示得全面细致。所以本文仅仅是对容器基础知识的归纳。至于容器提供的接口与使用实例,建议查取转载 2017-09-22 15:58:39 · 484 阅读 · 0 评论