C++语法学习
加油196
这个作者很懒,什么都没留下…
展开
-
C++为什么需要构造函数和析构函数
为什么要有构造函数和析构函数在我们过去学习C语言编程的时候,我们通常生成的变量都是放在栈区里(auto存储类型)。然而,真正处理实际问题的程序却常常将变量或数组生成在堆区里。假设我们定义了一个对象obj,此对象有一个占存储很大的成员member,将来要放很大的一篇文章,则我们不希望这个字符数组出现在栈区,而是希望它出现在堆区,如下图所示,翻译 2017-10-17 22:04:49 · 8136 阅读 · 0 评论 -
模板函数,模板函数重载,显示具体化模板,实例化
编译器在选择原型时,非模板版本函数优先于显示具体化和模板版本函数,而显示具体化优先于使用模板生成的版本。1 函数模板声明与定义时均需加上template 说明为函数模板。eg . template declaration: template void swap(T & a1 ,T & a2) ; 函数模板definition : template void原创 2017-10-23 09:04:05 · 538 阅读 · 0 评论 -
友元类,友元成员函数,
将一个类A再另一个类B的定义中声明(声明时加friend关键字),即该类A为定义类B的友元类。该类A的所有成员函数均是定义类B的友元函数(友元声明可以位于公用、私有、或者保护部分)。例: class student {friend class Operat ;string name ;double score ;public :.......};此时,Operat类原创 2017-10-23 10:13:18 · 316 阅读 · 0 评论 -
C++中的异常处理
程序异常: 需要定义一个抛掷异常的程序段。void Fun(){ ……throw 表达式 ;……} 其次,在主程序中,将可能出错的程序段放入try中,try{ Fun(……)}接着在try后对异常进行捕获和处理 catch (……) ……catch (……)……如果在catch中匹配不到所抛出的异常,将会运行terminate函数调用abort终止程序。当然也可以自己设置匹配不到异常时的默认处理:...原创 2018-02-01 22:45:28 · 179 阅读 · 0 评论 -
C++中的IO流
iostream 四种流对象: cin 标准输入流对象 cout 标准输出流对象 cerr 标准错误流对象 clog 标准错误流对象clog与cerr均是在显示器上显示出错信息,区别是cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出。cout 对象遇到endl时会立即取出缓冲区的数据,加上一个换行符...原创 2018-02-02 22:43:45 · 236 阅读 · 0 评论 -
stl入门 --string类
主要有:vector , algorithm容器 ,可以存储基本数据类型,也可以存储指针,类 vector<int> v1 , v1.push_back(1) v1.push_back(1) v1.push_back(1) 把 1.2.3 存储进容器。vector<int>::iterator it = v1.begin();定义一个迭代器(一个指针)。 ...原创 2018-03-07 22:02:32 · 155 阅读 · 0 评论 -
stl--vector容器,deque,stack,queue
定义容器: vector< int > v1 ; 将数据装入容器: v1.push_back(1) ;返回容器元素个数:v1.size() 取头部元素:v1.front();取尾部元素: v1.back()头部赋值 v1.front() = 11 , 尾部赋值 v1.back() = 13 ; 它们可以作为“左值 ”是因为函数返回的是引用。删除容器尾部元素:...原创 2018-03-07 22:53:20 · 236 阅读 · 0 评论 -
stl之List 、priority_queue、set:仿函数,pair查返回值、multiset
list 不能随机访问 即其迭代器 it不能跨度不能大于1. 只能it++ it--等list <int> l1 ; 可用 push_back push_front ....插入元素 l1.insert(pos , var ) pos位置变成var .删除元素 l1.clear() ; 清除所有元素。 l1.erase(beg , end) 删除从beg到e...原创 2018-03-10 17:29:39 · 199 阅读 · 0 评论 -
stl之map、multimap
map默认实现形式 map<T a T b > 即存在两个域,一个是键值,一个值域,其与set一样,元素只能唯一。map插入元素的三种形式: map <int ,string> mapStu ; mapStu.insert( pair<int ,string>(3 , "哈哈") ) ; mapStu.insert( ...原创 2018-03-11 17:09:45 · 169 阅读 · 0 评论 -
抽象类配合多继承使用
接口是不会出现二义性的。即在两个类中可以有同样的函数,只需要声明为纯虚函数,然后再在子类中定义(即实现接口)。当一个类继承了这两个类时,只会继承相同虚函数中的一个。原创 2017-10-21 09:14:13 · 1557 阅读 · 0 评论 -
友元函数
友元函数破坏了类的封装性在类里声明友元函数。 friend void get_name( classname * ptr ,int x ),声明的位置可在private ,也可在public 里 ; 属于全局函数。故在定义时,不用使用域解析符。可以通过友元函数访问类的私有属性。友元类 class A{ friend class B ; //声明B是A的友元} 则B的原创 2017-10-19 08:10:04 · 222 阅读 · 0 评论 -
构造函数,拷贝构造函数,以及赋值操作调用的具体使用
一般会产生临时对象的三种情况: 1,以值的方式给函数传参; 2,类型转换; 3,函数需要返回一个对象时;我们知道给函数传参有两种方式。1,按值传递;2,按引用传递(指针chua)。按值传递时,首先将需要传给函数的参数,调用拷贝构造函数创建一个副本,所有在函数里的操作都是针对这个副本的,也正是因为这个原因,在函数体里对该副本进行任何操作,都不会影响原原创 2017-10-20 15:06:41 · 577 阅读 · 0 评论 -
复制构造函数,赋值运算符重载,列表初始化
拷贝构造函数调用时机class Stud { ....} ;stud stu1 ={....} ;1 使用一个对象初始化另一个对象Stud stu2 = stu1 ; 2 Stu stu2 (stu1) ;3 对象作为实参传给函数形参printf_stu(const Stud st ) prittf_stu( stu1 ) ;4原创 2017-10-17 22:23:54 · 347 阅读 · 0 评论 -
C++中静态成员变量与静态成员函数,以及malloc , free , new , delete ,区别
int * p = (int * ) malloc(sizeof(int) ) ; int * p = (int * ) malloc(sizeof(int)*10); 生成一个数组的空间int * p = new int (10) ; 生成一个int型内存空间,并指向 10 int * p = new int[10] ; 生成数组的空间。也可以用原创 2017-10-18 20:00:25 · 1054 阅读 · 0 评论 -
一元操作符重载 ,请注意前置和后置会有区别,友元函数的真正用途
在重载前置的操作符时按正常即可。eg. classname & operator++(classname & clas) ; //前置重载声明 ;eg. classname & operator++(classname & clas, int) //后置重载声明, 函数重载不以 返回类型作为判断依据,所以应加一个占位符 .而且 注意后置是先调用值,再进行后置的操作。S原创 2017-10-19 14:39:39 · 989 阅读 · 0 评论 -
has - a , use - a , is - a (即继承);派生类的访问,多继承,虚继承 多态
类之间个关系:has -a ,包含关系, 一个类是另一个类的属性。uses-a , 类中有函数使用了另外一个类作为参数。eg. classA {useB (B & obj ) ;}is - a , 继承关系。既具有传递性,都具有共同的特征,又具有不对称性。 继承有三种继承, class Stu { } ;class Stu1 : public原创 2017-10-19 15:28:58 · 429 阅读 · 0 评论 -
多态的产生、静态,动态联编
(需要对应于C++的类型兼容性原则):子类对象可以当做父类对象使用子类对象可以直接赋值发给父类对象子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象多态:同样的调用语句具有多种不同的表现形态。在C++ primer 里描述的是 父类指针既可以指向自己类型的对象,也可以指向其派生出的对象。则可以使用一个数原创 2017-10-19 21:34:55 · 281 阅读 · 0 评论 -
函数重载,函数重写(虚函数重写),函数重定义(非虚函数重写),以及名称覆盖(函数重定义时,与父类参数个数不同,或是参数类型不同)
函数重载:(注意,子类无法重载父类的函数)必须在同一个类总进行。子类无法重载父类的函数,父类同名函数将被名称覆盖。重载时在编译期间根据参数类型和个数决定函数调用。函数重写:必须发生于父类与子类之间并且父类与子类中的函数必须有完全相同的原型使用virtual声明之后能够产生多态(如果不加virtual ,则是重定义)如果在父类中定义一个函数(没有声明为虚函数)原创 2017-10-20 08:13:43 · 1811 阅读 · 0 评论 -
关于sizeof一个类对象
先看一个空的类占多少空间? [cpp] view plain copyclass Base { public: Base(); ~Base(); }; 注意到我这里显示声明了构造跟析构,但是sizeof(Base)的结果是1. 因翻译 2017-10-20 10:21:05 · 639 阅读 · 0 评论 -
虚函数、纯虚函数、虚基类
1.虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的。2.纯虚函数是用来定义接口的,也就是基类中定义一个纯虚函数,基类不用实现,让子类来实现。3.虚基类是用来在多继承中,如果父类继承自同一个父类,就只实例化一个父类(说的有点绕,就是只实例化一个爷爷的意思=。=)。这个和多态有关,多态的定义不清楚的话到其他地方先了解一下,多态的三个必要条件:1.继原创 2017-10-20 10:23:40 · 469 阅读 · 0 评论 -
函数对象,一元谓词,二元谓词,预定义函数对象
find_if , sort , for_each 的使用 for_each(v1.begin(), v1.end(), ShowElemt<int>() ) ; 要使用预定义函数对象需要包含 functional 头文件vector<int>::iterator it = find_if(v1.begin(), v1.end(), myint ) sort(v3...原创 2018-03-24 13:04:38 · 1594 阅读 · 0 评论