【C++】C++学习笔记之十:类模板,函数模板及其他

static 与 this 指针

static

当类被多次实例化后,一般数据成员会有多份,而成员函数只有一份,通过this指针确定当前数据成员是在那个对象中被调用。但是类中的static成员却不尽相同:

static成员数据

类中的static数据成员,在类中只有一份,可以理解成,类范围内的静态全局变量。
类中的static数据成员必须在类外定义并初始化,类中声明。
就像静态变量,类中的static数据成员也只初始化一次,并在整个程序的声明周期中一直存在。

static成员函数

类的static成员函数,与普通成员函数不同,它被调用时不会传递this指针,也就是说他没有对象的概念。
类中的static成员函数,只能使用类中的static数据成员。(因为没有this指针不能确认那个普通数据成员可以使用)
static成员函数的调用方式有两种:
1.通过对象调用
2.通过class name调用

class complex{
    private:
        double re, im;
        static int instance_cnt;
    public:
        complex(double _re = 0, double _im = 0) : re(_re), im(_im) {  instance_cnt++; }
        complex(const complex & c):re(c.re), im(c.im) { instance_cnt++; }
        static int get_instance_num(){ return instance_cnt; } //返回当前类共有多少对象
};
int complex::instance_cnt = 0;

int main(){
    complex c1(1,2);
    complex c2(c1);
    complex c3 = c2;
    complex *pc = new complex(2,3);
    cout << "complex class has " << complex::get_instance_num() << " objects in total." << endl;//通过类名调用
    delete pc;
    pc = NULL;
    cout << "now the complex class has " << c1.get_instance_num() << " objects left." << endl;//通过类对象调用
}

以上运行结果:

Paste_Image.png

注:static 成员数据在类外定义的时候不需要使用static关键字:

Paste_Image.png

this指针

类的成员函数都有一个隐藏的参数——this指针,当数据成员被调用时都会隐式传入this指针。但是,对于类中的static成员函授,不会传入this指针,所以static成员函数无法处理对象的成员数据,而只能处理类中的static数据。

Paste_Image.png

放在private区中的constructor函数(singleton)

类的构造函数通常为public,这样才能构造出很多实例。但是,在设计模式中有一种专门把构造函数设计成私有成员,其作用就是保证一个类只能有一个实例,并提供一个全局唯一的访问点。这种设计模式叫做单例设计模式(singleton)

class Singleton{
    public:
        static Singleton* getInstance(){  
            if(!pIns){
                pIns = new Singleton();
            }
            return pIns ; 
        }
        static void dosth(){……}
        static void destory(){
            if(pIns){
                delete pIns;
                pIns = NULL;
            }
        }
    private:
        singleton(){}
        static singleton * pIns;
};

//调用:
int main(){
    for(int i = 0; i < 10; ++i){
        Singleton *ps  = Singleton::getInstance();//通过全局访问点访问,其实只有一个实例,并不是每次循环都创建
        Singleton::dosth();
    }
    Singleton::destroy();
    return 0;
}

singleton的特点:
不调用getInstance就没有Singleton类的实例存在,调用一次后,不管再调用多少次,都只有一个实例。

cout——一种ostream,重载了“<<”操作符

cout是一种ostream类,在其内部针对各种内置数据类型多次重载了操作符“<<”,使其可以输出内置数据类型的各种实例。因此用户定义的类中,如果想重载操作符"<<",必须定义成全局的操作符重载函数,第一个参数是ostream cout,第二个参数是自定义的类,这样才符合cout 在 “<<”左边,实例在右边的日常使用习惯。

cout类的内部实现

complex类,重载操作符“<<”的代码示例:

class complex{
private:
    double re, im;
public:
    friend ostream & operator<<(ostream & os, const complex& c);
};

ostream & operator<<(ostream & os, const complex& c){
    os << "(" << c.re << "," << c.im << ")" ;
    return os;
}

int main(){
    complex c1(1,2);
    cout << c1 << endl;
}

如果把操作符“<<”的重载设计成类成员函数,则其参数将只能有一个ostream类型,在调用的时候会默认出入this指针作为左值,这样对其的调用形式将是:“c1 << cout”,是不是很奇怪呢?完全不符合我们日常的使用习惯。
因此切记:对于自定义的类,其操作符“<<”的重载函数必须要写成全局变量才好!

类模板与函数模板

类模板

使用时必须显示指定类型

类模板的定义和使用

函数模板

使用时编译器会作参数推导,不用显示指定类型

函数模板参数推导

namespace

几种使用命名空间方式

使用命令的方式引用

语法:using namespace <名字空间名>

使用声明的方式引用

语法:using <名字空间名>::<函数名>

不使用using引用

语法:在使用的地方,直接以 <名字空间名>::<函数名> 的方式使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,505评论 1 51
  • 第一章 计算机与C++编程简介 C++程序6个阶段编程 ->预处理->编译->连接->装入->执行1.程序在编译器...
    rogertan30阅读 3,676评论 0 1
  • 第一天 一.内联函数(inline) 函数调用的时候需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些工作...
    陈果123阅读 1,115评论 0 1
  • 只有当一个人独处的时候,他才可以完全成为自己。
    为了追求不自量力阅读 291评论 0 1
  • 拥有愿景,使命和价值观,可以网聚天下志同道合之士,可以提高凝聚力,在遇到眼前困难时不至于人心涣散。 作为个人,要记...
    423429d90f38阅读 174评论 0 0