C++
ZacharyAdams
一起学习,一起成长!!!
展开
-
多重继承
如果一个类从两个不同的类里继承两个同名的成员,则需要在派生类中使用类限定符来区分他们。即在从A和B派生出来的c类中使用a::Show()和B::Show()来区分从这两个类那里继承的show()方法 如果一个类通过多种途径继承了一个非虚基类,则该类从每种途径分别继承非虚基类的一个实例。多个基类都是有问题的。使用虚基类的MI,当派生类使用关键字virtual来指示派生转载 2016-06-02 17:48:19 · 246 阅读 · 0 评论 -
非模版友元
声明一个常规友元template class HasFriend{public: friend void counts();}上边的声明使counts()函数成为模板所有实例化的友元counts()函数不是通过对象调用的(它是友元,不是成员函数),也没有对象参数,那么它如何访问HasFriend对象的呢有很多种可能性。它可以转载 2016-06-02 17:46:05 · 323 阅读 · 0 评论 -
友元类
友元类所有的方法都可以访问原始类的私有成员和保护成员声明friend class ClassName友元声明可以位于公有、私有或保护部分,其所在的位置无关紧要。由于Remote类提到了Tv类,所以编译器必须了解Tv类后才能处理Remote类,为些最简单的方法是首先定义Tv类。也可以使用前向声明,稍后介绍#includeusing std::cout;u转载 2016-06-02 17:44:44 · 234 阅读 · 0 评论 -
使用智能指针
三个智能指针模板(auto_ptr、unique_ptr和shard_ptr)都定义了类似指针的对象(c++11已将auto_ptr摒弃),可以将new获得(直接或间接)的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给这些对象,将无需记住稍后释放这些内存:在智能指针过期时,这些内存将自动被释放。下图说明了auto转载 2016-06-02 17:44:09 · 307 阅读 · 0 评论 -
explicit
c++的构造函数也定义了一个隐式转换explicit只对构造函数起作用,用来抑制隐式转换看一个小例子新建一个头文件#ifndef CMYSTRING_H#define CMYSTRING_H#include#includeusing namespace std;class CMyString{public:CMyString(const cha转载 2016-06-02 17:40:39 · 280 阅读 · 0 评论 -
climits
头文件定义的符号常量CHAR_MIN char的最小值SCHAR_MAX signed char 最大值SCHAR_MIN signed char 最小值UCHAR_MAX unsigned char 最大值SHRT_MAX short 最大值SHRT_MIN short 最小值USHRT_MAX转载 2016-06-20 15:17:38 · 351 阅读 · 0 评论 -
副本构造器
我们都知道两个指针指向同一个变量时如果一个指针被释放那么另一个就会出问题为了说明问题我做了一个很恶心的小例子class C{public : C(int v) { ptrInt=new int; *ptrInt=v; valueInt = v; } ~C() { } v转载 2016-06-02 17:37:54 · 469 阅读 · 0 评论 -
指针的指针和指针的引用
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。(这里说的指针的指针不是一个二维数组)为什么需要使用它们当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来的值。我们用下边的代码转载 2016-06-02 17:34:19 · 227 阅读 · 0 评论 -
常量指针和指针常量
常量指针 指向常量的指针,也就是说指针指向的对象是常量,指向的常量不能修改。指针不是一个常量,可以把指针指向别一个常量。常量指针是我们最常用的,一般声明形式如下: const int *p; int const *p; 例: int a(1), b(3); const int *p; // 或者转载 2016-06-02 17:33:37 · 229 阅读 · 0 评论 -
注意事项
》在基类方法声明中使用关键字virtual,可以使该方法在基类及所有的派生类中是虚的》如果使用指向对象的引用或指针来调用虚方法,程序将使用对象类型定义的方法,而不使用为引用或指针类型定义的方法 这称为动态联编或晚期联编,这种行为非常重要,因为这样基类指针或引用可以指向派生类对象》如果定义的类将被用作基类,则将那些要在派生类中重新定义的类方法声明为虚的。》构造函数不转载 2016-06-02 17:49:00 · 438 阅读 · 0 评论 -
this *this
在一个类里每个成员函数都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象可以使用*this。this是对象的地址,而不是对象本身。*this是对象本身。可以将*this 作为调用对象的别名Stock::Stock(const std::string &name){ this->m_company=name; (*this).m_c转载 2016-06-02 17:51:08 · 345 阅读 · 0 评论 -
typedef和#define的区别
1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查。它是预处理指令。 typedef 它在自己的作用域内给一个已经存在的类型一个别名。它是在是在编译时处理的。 例子:#define:#define DO doubleDO val =5;//相当于 double va =5;#define FUN(X) X+5in转载 2016-06-02 17:36:23 · 236 阅读 · 0 评论 -
指针数组和数组指针
指针数组 :就是指针的数组,数组的元素是指针; 数组指针:就是指向数组的指针。简单举例说明: int *p1[10]; 声明了一个数组,数组的元素是int型的指针。 int (*p2)[10]; 声明了一个指针, 指向了一个有十个int元素的数组。这两种写法主要是因为运算符的优先级, 因为[]的优先级比*高。第一种写法:p先和[]结合,所以是一个数组,转载 2016-06-02 17:56:24 · 289 阅读 · 0 评论 -
指针
指针:是说指针名表示的是地址。是一个变量,存储的是值的地址,而不是值本身 *运算符被称为间接值或解除引用运算符也可以叫做取地址符 声明一个指针 int * p_data; * p_data的类型为int 由于*运算符被用于指针,因此p_data变量本身必须是指针。 我们说p_data指向int类型,我们还说P_data的类型是指向int的指针,或int*转载 2016-06-02 17:55:35 · 258 阅读 · 0 评论 -
实例化和具体化
primer Plus在解释具体化和实例化看的有点乱,分解出来备忘在代码中包含函数模板本身并不会生成函数定义,它只是用于生成函数定义的方案编译器使用模板为我写类型生成函数定义时,得到的是模板实例如这个模板templatevoid Swap(T &t1,T &t2){ T _t; _t=t1; t1=t2; t2=_t;}转载 2016-06-02 17:54:36 · 474 阅读 · 0 评论 -
头文件
可以将程序分为二部分:头文件:包含结构声明和使用这些结构的函数的原型源代码文件: 包含与结构有关的函数的代码 不要将函数的定义或变量的声明放在头文件里,一般头文件可以包含以下内容>函数原型>使用#define或const定义的符号常量>结构声明>类声明>模板声明>内联函数在包含头文件时我们使用 #inc转载 2016-06-02 17:53:32 · 349 阅读 · 0 评论 -
静态持续变量
c++为静态存储持续性变量提供了3种链接性:外部链接性(可在其他文件中访问)内部链接性(只能在当前文件中访问)无链接性(别有用心能在当前函数或代码中访问)如果没有显示的初始化静态变量会把它设置为0要创建链接性为外部的静态持续变量,必须在代码块外面声明它要创建链接性为内部的静态持续变量,必须在代码块外面声明它,并使用static限定符要创建没有转载 2016-06-20 15:14:43 · 382 阅读 · 0 评论 -
数组
数组就是一组元素的内存位置,各个内存位置可以存储相同数据类型的数据项,而我们可以用相同的变量名引用所有的内存地址初始化数组int myA[5]={1,2,3,4,5};也可以这样int myA[5]={1,2,3} ; //这样前3个值是有初始值的,后2个是默认值0也可以为所有的元素一同初始化值int myA[5]={3};还可以省略数组的长转载 2016-06-20 15:15:07 · 356 阅读 · 0 评论 -
名称空间
using 声明和using 编译指令using 声明将特定的名称添加到它所属的声明区域中。using std::cout;将cout添加到声明区中,声明扣可以用coutint main(){ using std::cout; cout std::cin.get();}using声明使一个名称可用,而using转载 2016-06-02 17:51:39 · 301 阅读 · 0 评论 -
析构函数virtual与非virtual的区别
作为通常的原则,如果一个类定义了虚函数,那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着:这个类会被继承,并且会通过基类的指针指向子类对象,从而得到多态性。 这个类可能会被继承,并且会通过基类的指针指向子类对象”,因此基类的析构函数是否为虚将决定子类的对象是否被析构。示例代码:#include struct A{ virtual ~A() {cout转载 2016-06-02 17:32:42 · 375 阅读 · 0 评论