C++
HymanLiuTS
年过而立,又酸又臭,忙时敲代码,闲时读书写文章。
展开
-
【C++面向对象】重载++操作符
本文主要讨论下C++中++操作符的重载问题,为什么专门把++提出来介绍下它的重载?不知道大家有没有思考过一个问题?一般情况下我们重载一个操作符时,只要定义一个重载函数"operator操作符()"即可,那么重载++和--这两个操作符怎么办,要知道++是要分为前++和后++的,如果单纯重载++操作符,怎么区分前++和后++? C++中为了解决这个问题,采用了将后++定义成一个带有i原创 2016-11-03 09:44:13 · 1012 阅读 · 0 评论 -
【C++关键字】关于extern关键字的几点疑问
一、需要extern声明引入的变量是在别的文件中的头文件还是cpp文件? 我们先看下extern关键字的作用是什么?当我们将一个变量在文件中用extern声明引入后,它告诉连接器:这个变量的定义需要到别的模块中去寻找。而模块的编译单元是以cpp文件为核心的,但是cpp文件可以以include的方式包含任意的头文件。所以我们只有保证某个编译后的模块中含有extern声明的变量即可,也就原创 2017-03-20 19:00:36 · 840 阅读 · 0 评论 -
【C++数据类型】const 引用的几点用法
一、作为函数形参const引用作为函数形参,可以实现传入右值和常左值实参,我们通过和普通引用作为形参进行对比来说明这一点。首先,如下代码,将普通引用作为函数print的形参,传入右值和常左值引用,然后进行编译:#includeusing std::cout;using std::endl;void print(int& a){ cout<<a<<endl;}int mai原创 2016-09-29 11:02:00 · 1644 阅读 · 0 评论 -
【C++数据类型】C++中的类型转换(三)
下面,主要介绍下C++中的reinterpret_cast我们先看一个例子:#includeusing namespace std;int main(){ int i=100; int* pi=&i; double* dpi=pi; cout<<*pi<<endl; return 0;}我们知道,int类型的数据可以隐式转换成double类型的数据,那么int*能否原创 2016-09-23 23:37:35 · 863 阅读 · 2 评论 -
【C++数据类型】C++中的类型转换(二)
二、常类型转换 常类型转换,是去除变量的常量属性,我们先看下面的例子:#includeusing namespace std;int main(){ const int i=100; int* pi=&i; *pi=200; cout<<i<<endl; return 0;} 请思考,这段代码可以编译通过吗?会不会正常打印出2原创 2016-09-21 14:27:34 · 876 阅读 · 0 评论 -
【C++数据类型】C++中的类型转换(一)
我们知道C++是一种强类型的语言,在任何变量在使用之前,必须先要进行声明。C++也支持类型之间的转换,而且在保证类型安全的情况下还可以做一些隐式的类型转换,如int类型变量可以直接隐式转换成char型:int i=0;char c=i;除了隐式类型转换之外,C++还支持强制类型转换,共有6种转换形式:1、沿用C语言中的:type2 var2=(type2)var1原创 2016-09-21 11:42:47 · 1036 阅读 · 0 评论 -
【C++数据类型】C++中数组名的二义性
C++中数组名的二义性表现在在不同的上下文,数组名所代表的含义可能不一样,我们都知道数组名一般情况下表示数组首元素的地址,但是如下面的例子:#includeusing namespace std;void fun(int arr[3]){ cout<<sizeof(arr)<<endl;}int main(){ int arr[3]={0}; cout<<sizeo原创 2016-09-21 11:40:34 · 1595 阅读 · 0 评论 -
【C++面向对象】自定义重载操作符
什么是自定义重载操作符?我们知道C++允许我们对+、++、=等操作符进行重载,而我们在进行重载时,往往都会根据使用习惯,赋予它的近似原来的表现和行为。比如++运算符,在我们的概念中就是本事自加1,而我们在类中重载时往往也会这么做。本文研究的是将这些运算符重载成自定义的行为,以++为例,我们将其重载为计算一个类的平方。这种方式在实际编程中很少用到,本文主要通过这种方式介绍用算符重载时的两个规则:原创 2016-11-02 09:51:35 · 1786 阅读 · 0 评论 -
【C++面向对象】函数操作符()的重载
本文主要介绍函数操作符()的重载方法。通过对()的重载,我们可以像使用函数一样来使用类对象。为了方便介绍,我们先定义一个类: class Cal { };一、实现第一个重载()的函数。 我们想要实现的效果是调用Cal的重载函数,传给Cal一个double类型的参数,然后返回参数的平方。 重载函数代码如下:double operato原创 2016-11-10 09:25:34 · 1048 阅读 · 0 评论 -
【C++面向对象】C++中成员函数的const属性
下面主要对C++中关于成员函数的const属性进行讨论:(1)形参为const 这种情况和普通函数的形参为const的形式类似,形如: void print(const int& val); 此时,在print函数的内部,不能修改val引用所指的值,当修改时编译器会报错误:[Hyman@Hyman-PC const]$ g++ const.cpp const.原创 2016-10-17 18:40:03 · 1132 阅读 · 0 评论 -
【C++面向对象】C++中运算符重载的两种方式
我们知道在C++中可以通过重载运算符的方式,使类实现类似于基本类型的运算符操作,如+、-、*、/等等。本文介绍这种重载运算符的两种方法。我们先自定义一个类,来作为本次研究的对象:class Integer{ public: Integer(){} Integer(int i):m_i(i){} void get_val() { cout<<m_i<<endl;原创 2016-10-28 11:21:49 · 11263 阅读 · 2 评论 -
【C++面向对象】[]操作符的重载
本文主要介绍下[]操作符重载的问题。[]的操作符重载比较特殊之处在于重载时必须提供两个版本的重载函数,一个对应[]为左值时的情况,一个对应[]为右值时的情况。 我们假设有一个自定义的类Array需要我们实现[]的重载,期望的重载效果如下面的main()函数: int main(){ Array a1; a1[0]=123; const Array& a2=原创 2016-11-09 09:27:30 · 915 阅读 · 2 评论 -
【C++面向对象】深拷贝和浅拷贝
下面我们主要讨论下C++中深拷贝和浅拷贝的问题,何为浅拷贝和深拷贝?它主要针对拷贝指针时出现的两种不同的情况。 首先,解释下什么是浅拷贝。假设我们动态创建了一片内存,指针p指向这片区域,如下图所示: int* p=new int(100); 我们创建了一个int*指针p,并将其所指内存赋予值100,此时如果我们需要复制p的话,采用下面的方法: int*原创 2016-10-18 11:38:41 · 1124 阅读 · 0 评论 -
【C++面向对象】C++中访问控制符限定的是类而非对象
面向对象的语言中都设置了访控属性来控制外部对类成员的访问,这种访控属性是属于类的,而非属于对象!怎么理解这句话呢?首先看下面的例子:class Student{ private string name; void foo(const Student& s) { std::cout<<s.name<<std::endl; }};上面的Student类中的f原创 2016-09-30 14:14:11 · 1425 阅读 · 0 评论 -
【C++面向对象】C++的类型成员指针
本文主要研究下C++中的类型成员指针。一、类型成员指针是什么鬼? 相信很多童鞋刚刚听到这个名字时,第一反应就是不就是类中的指针成员变量吗,有什么好研究的?错,而且是大错而特错,请注意这两种叫法的区别:前者是类型成员指针,后者是类指针成员。差之毫厘失之千里也。 那么什么是成员类型指针呢?我们先看声明一个类,作为本次研究的小白鼠。 class person{ public:原创 2016-10-26 09:39:46 · 1298 阅读 · 1 评论 -
【C++内存管理】浅析C++中函数调用时的内存分配-函数调用过程中其他函数相关的内存分布
#includeusing namespace std;void print(){ cout<<"hello world"<<endl;} void test(){ int arr[1]; arr[2]=(int)print;} int main(){ test(); return 0;}以上代码,运行结果为:[Hyman@Hyman-PC cplus原创 2016-09-28 18:57:29 · 1288 阅读 · 0 评论 -
【C++内存管理】浅析C++中函数调用时的内存分配-函数局部变量的内存分配
学习了C++这么久,内存问题感觉一直是一个拦路虎一样,说懂了感觉懵懵懂懂,说没懂吧,感觉也不是啥都不知道。有必要把它整理出来作为自己的一个知识体系的架构吧。现在就从函数调用时的内存管理入手。一、函数中普通变量的内存分配问题我们知道当一个函数进行调用时,函数的形参、以及函数的局部变量都会在栈中被分配内存,而栈又可分为两种,一种是栈底不变,栈顶不断的动态变化;另一种是栈顶不变,栈底在动态变原创 2016-09-27 11:27:07 · 2556 阅读 · 1 评论 -
【C++面向对象】输入输出操作符的重载
本文主要介绍输入操作符>>和输出操作符 const Integer operator+(const Integer& that) const; 上面采用类的成员函数的重载形式,请大家不要忘记函数里面还隐藏包含一个this指针作为左操作数。我们再来看下用友元函数形式重载的前++操作符: friend Integer& operator++(原创 2016-11-04 15:18:53 · 1200 阅读 · 0 评论 -
【C++模板】C++声明模板时能否用struct关键字代替class或者typename
我们知道C++中声明一个函数或者类的模板支持两种关键字class和typename:template struct Person{public: T age;};或者template struct Teacher{public: T age;}; 而且我们知道在C++中struct和class关键字基本上是等价的,因为要兼容C语言,所原创 2017-03-20 19:04:19 · 9405 阅读 · 2 评论