摘要:
我把类模板的声明放在头文件中,把定义在类模板外部的成员函数放在CPP文件中。(VC6)结果,在链接时出错:mytemp.obj : error LNK2001: unresolved external symbol "public: int __thiscall Queue::remove(void)" mytemp.obj : error LNK2001: unresolved external symbol "public: void __thiscall Queue::add(int const &)" 找了一下原因:Code refere 阅读全文
摘要:
虚函数有实现并且派生类可以选择是否重写该函数,纯虚函数不提供函数的实现并且如果派生类要成为具体类则必须重写该纯虚函数,否则派生类仍然为抽象类。 阅读全文
摘要:
重载overload:是函数名相同,参数列表不同重载只是在类的内部存在。但是不能靠返回类型来判断。重写override:也叫做覆盖。子类重新定义父类中有相同名称和参数的虚函数。函数特征相同。但是具体实现不同,主要是在继承关系中出现的。重写需要注意:1 被重写的函数不能是static的。必须是virtual的2重写函数必须有相同的类型,名称和参数列表3重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的重定义 (redefining)也叫做隐藏:子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。如果一个 阅读全文
摘要:
C++ 派生类对象的地址可以赋给基类型指针,因为派生类对象是一种基类对象。而将基类对象的地址赋值给派生类指针则是错误的。ParentClass *pc;SonClass sc;pc = ≻pc指针可以调用的功能(函数)取决于该函数的句柄类型(即指针或引用的类型),而不是取决于句柄所指向的对象的类型。eg:这里父类中有成员函数print(),子类中也有print()函数;那么pc->print();这里调用的是父类中的print();因为pc指针的类型为ParentClass; 阅读全文
摘要:
1,运算符函数既可以是成员函数也可以是全局函数。为了提高性能,通常将全局函数定义为友元。成员函数用this指针隐式地获得一个类对象实参(二元运算符的左操作数)。在全局函数调用中,必须显示地列出表示二元运算符的两个操作数的实参。2.重载(),[],->或任何赋值运算符是,必须将运算符重载函数声明为类的成员。其他运算符的重载函数既可以是类的成员也可以是全局函数。3.当运算符函数实现为成员函数时,最左侧的(或是唯一的)操作数必须是该运算符所属类的对象(或是该类对象的引用)4.如果左操作数必须是一个不同类的对象或基本类型对象,则运算符函数必须实现为全局函数。5.如果全局运算符函数必须直接访问类的 阅读全文
摘要:
当类被实例化时,编译器会执行隐式转换的单实参构造函数,该构造函数接受的实参类型被转换成该构造函数所属类的对象。这种转换是自动的,不需要程序员进行强制类型转换。有些情况下,隐式转换是不必要的而且容易出错。eg:class Array{ Array(int a=10); //单实参构造函数,会隐身转换实参类型private:int size;int *ptr;};Array::Array(int a){ size = (s>0)?s:10;//验证数组大小 ptr = new int[size]; for(int i=0;i < size ; i++){ ... 阅读全文
摘要:
delete ptr;ptr =0;在释放动态分配的内存后,应将指向该内存的指针设置为0.这样可以断开指针与之前在空闲存储区分配的空间的联系。尽管已经释放掉了,该内存空间任然可以包含信息。通过将指针设置为0,程序不能访问该空间存储空间,事实上,该空间可能已经被分配用于其他不同的用途。如果没有将指针设置为0,那么代码可能不小心访问 到新的信息,导致极其微妙、不可重复的逻辑错误。 阅读全文
摘要:
如果类的成员函数不访问类的非static数据成员或非static成员函数,那么应该将他声明为static。和非static成员函数不同,static成员函数没有this指针,因为static数据成员和static成员函数独立于类的任何对象而存在。this指针必须指向特定的类对象,并且当static成员函数被调用时,内存中可能不存在任何该类的对象。一些结构在软件工程标准中指定,所有static成员函数的调用都使用类名而不使用对象句柄。static成员函数不能声明为const 阅读全文
摘要:
1,传值,当把值赋给函数形参时,是赋值的副本,在函数里做的任何改变都不会影响实参的值,eg:void swap(int a,int b){ int temp; temp = a; a = b; b = temp; printf("a=%d,b=%d\n",a,b); }int main(void){ int a = 7; int b = 9; swap(a,b); printf("a=%d,b=%d\n",a,b); return 0;}output:a=9b=7a=7b=92,传引用,是在函数形参的前面加上(&)符... 阅读全文
摘要:
1. 类型clock_t: 是个long型,用来记录一段时间内的时钟计时单元数,即CPU的运行单元时间。size_t: 标准C库中定义的,应为unsigned int,在64位系统中为long unsigned int。time_t: 从1970年1月1日0时0分0秒到该时间点所经过的秒数。struct tm { int tm_sec; /* 秒 – 取值区间为[0,59] */ int tm_min; /* 分 - 取值区间为[0,59] */ int tm_hour; /* 时 - 取值区间为[0,23] */ int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] * 阅读全文