随笔分类 -  learn c++ 基础

摘要:在确定一个数组大小的时候我们一般用sizeof int arr1[] = {1 , 2, 4 ,5}; int arr1_len = sizeof arr1/sizeof(int); std::cout<< "arr1 len: " << arr1_len << std::endl; 但是如果数组是 阅读全文
posted @ 2020-06-21 09:37 li-peng 阅读(13578) 评论(0) 推荐(0)
摘要:作为通常的原则,如果一个类定义了虚函数,那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着:这个类会被继承,并且会通过基类的指针指向子类对象,从而得到多态性。 这个类可能会被继承,并且会通过基类的指针指向子类对象”,因此基类的析构函数是否为虚将决定子类的对象是否被析构示例代码:#in... 阅读全文
posted @ 2015-05-21 13:51 li-peng 阅读(543) 评论(0) 推荐(0)
摘要:说一下常量指针和指针常量 的区别。常量指针 指向常量的指针,也就是说指针指向的对象是常量,指向的常量不能修改。指针不是一个常量,可以把指针指向别一个常量。常量指针是我们最常用的,一般声明形式如下: const int *p; int const *p;例: int a(1... 阅读全文
posted @ 2015-05-19 22:16 li-peng 阅读(1188) 评论(0) 推荐(0)
摘要:展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。(这里说的指针的指针不是一个二维数组)为什么需要使用它们当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的... 阅读全文
posted @ 2014-11-24 10:22 li-peng 阅读(127941) 评论(29) 推荐(17)
摘要:总结一下typedef和#define的区别1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查。它是预处理指令。 typedef 它在自己的作用域内给一个已经存在的类型一个别名。它是在是在编译时处理的。 例子:#define:#define DO doubleDO val =... 阅读全文
posted @ 2014-07-18 16:34 li-peng 阅读(4312) 评论(2) 推荐(0)
摘要:我们都知道两个指针指向同一个变量时如果一个指针被释放那么另一个就会出问题为了说明问题我做了一个很恶心的小例子class C{public : C(int v) { ptrInt=new int; *ptrInt=v; valueInt = v; ... 阅读全文
posted @ 2014-06-08 16:31 li-peng 阅读(2608) 评论(2) 推荐(1)
摘要:头文件定义的符号常量CHAR_MIN char的最小值SCHAR_MAX signed char 最大值SCHAR_MIN signed char 最小值UCHAR_MAX unsigned char 最大值SHRT_MAX short 最大值SHRT_M... 阅读全文
posted @ 2014-06-08 15:08 li-peng 阅读(519) 评论(0) 推荐(0)
摘要:c++的构造函数也定义了一个隐式转换explicit只对构造函数起作用,用来抑制隐式转换看一个小例子新建一个头文件#ifndef CMYSTRING_H#define CMYSTRING_H#include#includeusing namespace std;class CMyString{public:CMyString(const char * str);void SetString(string str);};#endif // CMYSTRING_H实现它#include "CMyString.h"CMyString::CMyString(const char * 阅读全文
posted @ 2014-04-04 15:22 li-peng 阅读(393) 评论(0) 推荐(0)
摘要:三个智能指针模板(auto_ptr、unique_ptr和shard_ptr)都定义了类似指针的对象(c++11已将auto_ptr摒弃),可以将new获得(直接或间接)的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给这些对象,将无需记住稍后释放这些内存:在智能指针过期时,这些内存将自动被释放。下图说明了auto_ptr和常规指针在行为方面的差另:share_ptr和unique_ptr的行为与auto_ptr相同使用智能指针必须包含头文件memory文件模板定义。然后使用通常的械板语法来实例化所需类型的指针。auto_pter包含 阅读全文
posted @ 2014-03-24 09:53 li-peng 阅读(539) 评论(0) 推荐(0)
摘要:友元类所有的方法都可以访问原始类的私有成员和保护成员声明friend class ClassName友元声明可以位于公有、私有或保护部分,其所在的位置无关紧要。由于Remote类提到了Tv类,所以编译器必须了解Tv类后才能处理Remote类,为些最简单的方法是首先定义Tv类。也可以使用前向声明,稍后... 阅读全文
posted @ 2014-01-15 13:35 li-peng 阅读(2787) 评论(0) 推荐(0)
摘要:非模板友元声明一个常规友元template class HasFriend{public: friend void counts();}上边的声明使counts()函数成为模板所有实例化的友元counts()函数不是通过对象调用的(它是友元,不是成员函数),也没有对象参数,那么它如何访问HasFriend对象的呢有很多种可能性。它可以访问全局对象;可以使用全局指针访问非全局对象;可以创建自己的对象;可以访问独立对象的模板类的静态数据成员。如果要为友元函数提供械板类参数,可以如下所示来进行友元声明。要提供模板类参数,必须指明基体化templateclass HasFriend{ friend.. 阅读全文
posted @ 2014-01-10 20:15 li-peng 阅读(3642) 评论(0) 推荐(0)
摘要:如果一个类从两个不同的类里继承两个同名的成员,则需要在派生类中使用类限定符来区分他们。即在从A和B派生出来的c类中使用a::Show()和B::Show()来区分从这两个类那里继承的show()方法如果一个类通过多种途径继承了一个非虚基类,则该类从每种途径分别继承非虚基类的一个实例。多个基类都是有问题的。使用虚基类的MI,当派生类使用关键字virtual来指示派生时,基类就成为虚基类:class A:public virtual B{}主要变化是,从虚基类的一个或多个实例派生而来的类将只继承了一个基类。对实现这种特性,必须满足其他要求:1》有间接虚基类的派生类包含直接调用间接基类构造函数的构造 阅读全文
posted @ 2014-01-07 09:48 li-peng 阅读(1965) 评论(0) 推荐(1)
摘要:》在基类方法声明中使用关键字virtual,可以使该方法在基类及所有的派生类中是虚的》如果使用指向对象的引用或指针来调用虚方法,程序将使用对象类型定义的方法,而不使用为引用或指针类型定义的方法 这称为动态联编或晚期联编,这种行为非常重要,因为这样基类指针或引用可以指向派生类对象》如果定义的类将被用作基类,则将那些要在派生类中重新定义的类方法声明为虚的。》构造函数不能是虚函数》析构函数应当是虚函数》友元不能是虚函数,只有成员类才能是虚函数 阅读全文
posted @ 2014-01-05 13:02 li-peng 阅读(417) 评论(0) 推荐(0)
摘要:1.不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象会消失,引用将指向不存在的数据 2.返回指向const对象的引用 使用const引用的常见原因是旨在提高效率,但对于何时采用这种方式存在一些限制。 如果函数返回传递给它的对象,可以通过返回引用来提高效率。 A Max(con 阅读全文
posted @ 2014-01-01 12:18 li-peng 阅读(400) 评论(0) 推荐(0)
摘要:在一个类里每个成员函数都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用 对象可以使用*this。this是对象的地址,而不是对象本身。 *this是对象本身。可以将*this 作为调用对象的别名 this 这是指代本对象this本来是个指针,*this的星号是取指针指向的内容 阅读全文
posted @ 2013-12-26 21:09 li-peng 阅读(444) 评论(0) 推荐(0)
摘要:using 声明和using 编译指令using 声明将特定的名称添加到它所属的声明区域中。using std::cout;将cout添加到声明区中,声明扣可以用cout<<代替 std::cout<<int main(){ using std::cout; cout<<"a"; std::cin.get();}using声明使一个名称可用,而using 编译指令使所有的名称都可以用。using namespace std;int main(){ cout<<"aa"; cin.get();}名称空间使用原 阅读全文
posted @ 2013-12-24 20:47 li-peng 阅读(384) 评论(0) 推荐(0)
摘要:c++为静态存储持续性变量提供了3种链接性:外部链接性(可在其他文件中访问)内部链接性(只能在当前文件中访问)无链接性(别有用心能在当前函数或代码中访问)如果没有显示的初始化静态变量会把它设置为0要创建链接性为外部的静态持续变量,必须在代码块外面声明它要创建链接性为内部的静态持续变量,必须在代码块外面声明它,并使用static限定符要创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static限定符用一个代码片段说明这3种变量int global =100//静态持续外部链接性static int one_file=50//静态持续 内部链接性int main(){}void fun 阅读全文
posted @ 2013-12-24 20:25 li-peng 阅读(669) 评论(0) 推荐(0)
摘要:数组就是一组元素的内存位置,各个内存位置可以存储相同数据类型的数据项,而我们可以用相同的变量名引用所有的内存地址初始化数组int myA[5]={1,2,3,4,5};也可以这样int myA[5]={1,2,3} ; //这样前3个值是有初始值的,后2个是默认值0也可以为所有的元素一同初始化值in... 阅读全文
posted @ 2013-12-24 20:25 li-peng 阅读(315) 评论(0) 推荐(0)
摘要:可以将程序分为二部分:头文件:包含结构声明和使用这些结构的函数的原型源代码文件: 包含与结构有关的函数的代码不要将函数的定义或变量的声明放在头文件里,一般头文件可以包含以下内容>函数原型>使用#define或const定义的符号常量>结构声明>类声明>模板声明>内联函数在包含头文件时我们使用 #include "head.h"而不是#include 如果使用 c++编译器将在存储标准头文件的主机系统的文件系统中查找;如果使用"" 编译器会首先查找当前的工作目录或源代码目录,如果没有找到头文件,再去标准位置查找注意:在I 阅读全文
posted @ 2013-12-19 15:10 li-peng 阅读(1872) 评论(0) 推荐(0)
摘要:primer Plus在解释具体化和实例化看的有点乱,分解出来备忘在代码中包含函数模板本身并不会生成函数定义,它只是用于生成函数定义的方案编译器使用模板为我写类型生成函数定义时,得到的是模板实例如这个模板templatevoid Swap(T &t1,T &t2){ T _t; _t=t1; t1=t2; t2=_t;}调用 int i = 10,j=20; ::cout指示类型并在声明前加上template:template void Swap(int &t1,int &t2);例子#includeusing namespace std;templ... 阅读全文
posted @ 2013-12-18 12:31 li-peng 阅读(5408) 评论(1) 推荐(0)