我们用C++写类的时候,通常会将.cpp和.h文件分开写,即实现和声明分开写了:但在C++的类模板中,这种写法是错误的. 在<C++编程思想>的第16章的"16.3模板语法"一节给出了答案,以下是下书中原话: 即使是在创建非内联函数定义时,我们还是通常想把模板的所有声明都放入一个头文件中.这似乎违背了通常的头文件规则:"不要放置分配存储空间的任何东西"(这条规矩是为了防止在连接期间的多重定义错误),但模板定义很特殊.由template<->…
C++中每个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的.只有模板被真正使用的时候,编译器才知道,模板套用的是什么类型,应该分配多少空间.这也就是模板类为什么只是称之为模板,而不是泛型的缘故. 既然是在编译的时候,根据套用的不同类型进行编译,那么,套用不同类型的模板类型实际上就是两个不同的类型,也就是说,stack<int>和stack<char>是两个不同的数据类型,他们共同的成员函…
最近在仿写stl,发现stl源码中将模板的声明与定义写在一起实在很不优雅.自己尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误.这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误. 上面这句话有点抽象.要理解为什么会出错,首先要理解用传统方法写非模板函数时,编译器是怎么运作的.举个例子 //-----------…
6.2  类:当C++爱上面向对象 类这个概念是面向对象思想在C++中的具体体现:它既是封装的结果,同时也是继承和多态的载体.因此,要想学习C++中的面向对象程序设计,也就必须从“类”开始. 6.2.1  类的声明和定义 面向对象思想把现实世界中的所有事物都看成是对象,而类是对所有相同类型对象的抽象,是对它们总体的一个描述.比如,学校有很多老师,张老师.李老师.王老师,虽然每个老师各不相同,是不同的对象个体.但他们都是老师这一类型的对象,有着共同的属性(都有姓名.职务)和相同的行为(都能上课.批…
什么是变量?变量或者叫对象,是一个有具名的.可以供程序操作的存储空间.这里具名是指变量是有名字的,可供操作是指能进行加减乘除或者输入输出等操作,存储空间则是指有一块属于它的内存空间. 为了便于说明,标题和后面的内容将对象分为两种.对于内置的,文章称作为变量,对于自定义的,称之为对象. 第一个问题:在C++中,什么是定义,什么是声明? ①定义:用于为变量分配存储空间,还可为变量指定初始值.在程序中,变量有且仅有一个定义. ②声明:用于向程序表明变量的类型和名字.在程序中,变量可以有多个声明. 定义…
#include <stdio.h> #include <stdlib.h> void singing(); int main() { singing(); system("pause"); } void singing() { printf("after party~after party~我已然赶不上地铁\n"); } 上述代码段是一个C语言函数的声明过程,首先要声明一个函数(第三行),然后定义函数(第10行),第6行调用这个函数 带参数…
1.对于以下的声明语句 int a;        假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间.由于外部对象a并没有被明白指定不论什么初始值,所以它的初始值默觉得0(某些系统中的连接器对以其它语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0). 2.又如以下的声明语句: int a = 7;       在定义a的同一时候也为a明白指定了初始值. 这个语句不…
1. SpreadsheetCell.h #pragma once #include <string> class SpreadsheetCell { public: void setValue(double inValue); double getValue() const; void setString(const std::string& inString); const std::string& getString() const; private: std::stri…
将模板的声明与定义写在一起实在很不优雅.尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义, 然后在main函数里包含.h头文件,这样会报链接错误.why!!!!!!!!!!!!! 这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,(carefully!!!) 如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误.(类模板同样!!) //---------------test.h-------------------/…
课程<C++语言程序设计进阶>清华大学 郑莉老师) 引入 考虑一个求绝对值函数myabs,对于int,double,float等数据类型需要重载多次,编写多个函数体.函数体逻辑代码完全一致,仅仅是数据类型不同. 在这种情况下,可以使用函数模板 #include <iostream> using namespace std; int myabs(int x) { return x >= 0 ? x : -x; } float myabs(float x) { return x…