实例化

C++11 外部模板

隐身守侯 提交于 2020-01-24 03:00:54
【1】引入外部模板为了解决什么问题? “外部模板”是C++11中一个关于模板性能上的改进。实际上,“外部”(extern)这个概念早在C的时候已经就有了。 常见的情况,在一个文件a.c中定义了一个变量int i,而在另外一个文件b.c中想使用它,这个时候就会在没有定义变量i的b.c文件中做一个外部变量的声明。比如: // 声明在b.c文件中 extern int i; 这样做的好处是,在分别编译了a.c和b.c之后,其生成的目标文件a.o和b.o中只有i这个符号(可简单理解为变量)的一份定义。 具体地,a.o中的i是实在存在于a.o目标文件的数据区中的数据,而在b.o中,只是记录了i符号会引用其他目标文件中数据区中的名为i的数据。 这样一来,在链接器(通常由编译器代为调用)将a.o和b.o链接成单个可执行文件(或者库文件)c的时候,c文件的数据区也只会有一个i的数据(供a.c和b.c的代码共享)。 而如果b.c中我们声明int i的时候不加上extern的话,那么i就会实实在在地既存在于a.o的数据区中,也存在于b.o的数据区中。 那么链接器在链接a.o和b.o的时候,就会报告错误,因为无法决定相同的符号是否需要合并。 而对于函数模板来说,现在我们遇到的几乎是一模一样的问题。 不同的是,发生问题的不是变量(数据),而是函数(代码)。这样的困境是由于模板的实例化带来的。

C++容器篇

若如初见. 提交于 2020-01-24 01:52:32
C++容器篇 一:vector向量(动态数组) 使用容器的步骤: 1.包含相关头文件 2.实例化一个对象 # include <iostream> # include <string> # include <vector> //包含相关头文件 using namespace std ; int main ( ) { //实例化对象分为有参和无参两种: //1.无参 vector < string > strVector ; //2.有参 vector < int > intVector ( 3 ) ; //动态数组的长度 return 0 ; } 1.有参实例化对象时,参数规定了向量的大小即动态数组的长度,这时进行插入时可以采用数组的方式进行插入。但是,需要注意的是当超过传入的容量后,只能通过成员函数的方式进行插入。 2.无参实例化对象时,只能通过成员函数的方式进行插入。 基本方法: (一):插入操作:push_back(); (尾部插入) (二):删除操作:pop_back(); (尾部删除) 万金油参数: (一)size();//当前容器数据个数 (二)empty();//当前容器是否为空 # include <iostream> # include <string> # include <vector> //包含相关头文件 using namespace std ; int

单例设计模式

二次信任 提交于 2020-01-23 05:01:24
对所有的Java开发者而言,所有项目中最为常见的三个设计模式:工厂设计模式、代理设计模式、单例设计模式。 单例设计模式: 如果一个类中定义有普通方法,那么这些普通方法一定要通过本类的实例化对象你才可以调用。 传统调用: class Single{ public void print(){ System.out.println("单身"); }}class TestDemo{ public static void main(String arg[]){ Single single = new Single(); single.print(); }}运行结果:单身 在本程序中Single是一个普通的类,由于本类并没有进行任何构造方法的定义,所以这个类中会自动生成一个无参的、什么都不做的的构造方法,正是因为如此,我们可以在外部进行无参构造的调用。 但现在相对Single 类做一个修改: class Single{ private Single(){} public void print(){ System.out.println("单身"); }}class TestDemo{ public static void main(String arg[]){ Single single= null; single = new Single(); single.print(); }} 运行结果

白话C++系列(21) -- 虚继承

試著忘記壹切 提交于 2020-01-22 21:32:10
虚继承 多继承+多重继承的烦扰 先来看一个例子,在这个例子中,类A是父类,类B和类C继承了类A,而类D既继承类B又继承类C(如下图所示),我们称这种继承关系又称之为菱形继承。在菱形继承中我们发现,既有多继承,也有多重继承 那么,现在问题来了…… 当我们要实例化D的对象的时候呢,我们发现,D是从B继承来的,B又是从A继承来的;而D也是从C继承来的,C又是从A继承来的,这样一来,D中就含有两个一样的A的数据,而这种情况是我们不能容忍的。因为在一个对象当中有两份完全相同的数据,这种冗余数据我们没有办法来承担它的系统开销,所以我们必须要解决。也许,你会说在实际的工作中会遇到这么复杂的情况吗?我们来看一看,不用实际工作,我们只需要回顾一下前面举过的例子:之前我们讲过人这个类,也讲过工人,农民和农民工这三个类,那么,工人和农民可以继承人这个类,而农民工则既可以继承农民,也可以继承工人这两个类(如下) 那么,这种典型的菱形继承关系用什么办法刚才我们所说的数据冗余的问题呢?那就要用到接下来要讲到的虚继承相关知识。 虚继承 虚继承是继承的一种方式,其关键字是virtual,我们来看一看如何使用,请看下面这个例子。 在这个例子中,我们定义了一个工人的类,工人的类要去继承人这个类,而工人这个类将来也会被农民工这个类所继承,我们就把工人这个类就称之为虚基类。那么,在工人这个类去继承人这个类的时候

C++之虚拟继承

断了今生、忘了曾经 提交于 2020-01-22 21:30:52
定义: class B { private: B() { } friend class A; }; 将导致B无法被除A以外的其它任何class直接继承以后实例化,也就是说,在上面这个定义的基础上,如果你再定义: class C:public B{}; 将导致编译能够通过,但是无法实例化C(那当然也没用了,所以间接实现了一个无法继承的类B),但是因为A是B的友元,所以能够进入B的private区域,所以如果定义: class A:public B{}; 能够实例化A. 但是这样定义还有一个漏洞,如果在A普通public继承B的基础上再定义: class D:public A{}; 你会发现D也是可以实例化的,那么相当于间接public继承了B。这显然不是我们想要的,所以,正确的做法是(完整代码): class A; class B { private: B() { } friend class A; }; class A:virtual public B{}; //A is the one we're looking for 也就是说要做到三步: 1)将你B的相关构造函数放入private区域 2)声明子类A为B的友元 3)定义A为virtual public继承B 这样创建的代码的效果是: B不能被继承也不能被实例化 A可以被实例化,但是不能被继承 ================

设计模式(单例和简单代理)

不羁岁月 提交于 2020-01-22 09:47:14
设计模式(单例和简单代理) 一、单例(Singleton) 确保一个类只有一个实例,并提供该实例的全局访问点。 Ⅰ 饿汉式 顾名思义,饿汉初始化类时,直接静态加载 SingletonDemo01 类的实例 instance , 不管用到没用到这个实例,都创建出来了 ,所以没有延时加载的优势。 ***评价:**线程不安全的问题主要由于实例化多次才会造成,采取直接实例化不会产生线程不安全问题,但也丢失了延迟实例化带来的节约资源你的好处 /** * 测试饿汉式单例模式 * @author wangqun * */ public class SingletonDemo01 { //类初始化时,立即加载这个对象(没有延时加载的优势!) 由于加载类时天然线程安全! private static SingletonDemo01 instance = new SingletonDemo01 ( ) ; private SingletonDemo01 ( ) { } //方法不用加synchronized 效率高! public static SingletonDemo01 getInstance ( ) { return instance ; } } Ⅱ 懒汉式 类初始化时,没有创建对象,真正使用的时候才创建! 评价: 这个实现在多线程环境下是不安全的,如果多个线程能够同时进入 if

让人又爱又恨的this

风流意气都作罢 提交于 2020-01-22 05:49:58
this是个神奇的东西, 既可以帮助我们把模拟的类实例化、 又可以在事件绑定里准确指向触发元素、 还可以帮助我们在对象方法中操作对象的其他属性或方法、 甚至可以在使用apply、call、bing、filter等方法时指向我们指定的对象,以便灵活的使用。 但是如此强力的东西,势必有时难以把握,今天遇到一问题,出了错,重新温故下常见的this指向问题。 要说灵活无比的this的指向,很有必要先知道一个知识点,JavaScript中有四种调用模式。 this的指向很大程度收调用模式的影响,具体如下 1.构造器调用模式=>this指向实例化出来的对象 2.方法调用模式=>this指向方法所属的对象 3.函数调用模式(即函数不是对象的方法,仅仅普通调用时,今天就错在这,5555)=>this指向全局对象global(在浏览器运行环境下,global其实就是window) 4.apply调用模式=>this指向apply方法接收的第一个参数 看文字或许不太明了,上点代码 //先来看看构造器调用模式和方法调用模式 var name='你查看的是全局对象的属性'; var Foo=function (name) { this.name=name; //这里的this是在构造函数里,当new+构造函数实例化对象时,this会被绑定到实例化的对象上 this.say=function () {

C++ template

爷,独闯天下 提交于 2020-01-21 03:45:27
转自 http://www.cnblogs.com/assemble8086/archive/2011/10/02/2198308.html 一、类模板定义及实例化 1. 定义一个类模板: 1 template<class 模板参数表> 2 3 class 类名{ 4 5 // 类定义...... 6 7 }; 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是 类型参数 ,也可以是 非类型参数。 类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。 例: 1 template<class type,int width> 2 3 //type为类型参数,width为非类型参数 4 5 class Graphics; 注意: (1) 如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。 (2) 模板参数名不能被当作类模板定义中类成员的名字。 (3) 同一个模板参数名在模板参数表中只能出现一次。 (4) 在不同的类模板或声明中,模板参数名可以被重复使用。 1 typedef string type; 2 3 template<class type,int width> 4 5 class Graphics 6 7 { 8 9 type node;/

菜鸡的Java笔记 第二十四 - java 接口的基本定义

风流意气都作罢 提交于 2020-01-20 03:15:26
1.接口的基本定义以及使用形式 2.与接口有关的设计模式的初步认识 3.接口与抽象类的区别 接口与抽象类相比,接口的使用几率是最高的,所有的设计几乎都是围绕着接口进行的 但是要想把接口彻底弄明白,需要很长一段时间 接口是一种特殊的类,但是在接口里面的组成与类不同,比类的组成部分简单,主要由抽象方法和全局常量所组成 而接口使用 interface 关键字来定义 范例:定义一个接口 interface A{ // 定义了一个接口 public static final String MSG = "Hi"; public abstract void ptint(); } public class Interface{ public static void main(String args[]){ // 无法实例化,但是可以调用 System.out.println(A.MSG); } } 在以后不管学习到系统类库的使用还是自己写代码的时候,接口里面的主要组成(98%)都是抽象方法 当一个接口定义完成之后,需要遵循如下的步骤进行接口的使用 接口一定要定义子类,子类利用 implements 关键字来实现(实现这个词可以理解为继承)接口,一个子类可以同时实现多个接口 秒杀抽象类的单继承局限,一个抽象类只能够被一个子类所继承 接口的子类(如果不是抽象类)那么必须覆写接口中的全部抽象方法

Spring-2-Bean之xml

杀马特。学长 韩版系。学妹 提交于 2020-01-18 18:29:33
一、Bean的实例化方式 Bean的实例化有三种方式: 通过构造函数实例化(常用) 通过静态工厂实例化 通过实例工厂实例化 1. 通过构造函数实例化(常用) < bean id = " bean1 " class = " com.seven.entity.Bean1 " /> 2. 通过静态工厂实例化 准备一个静态工厂: package com . seven . factory ; import com . seven . entity . Bean2 ; public class Bean2StaFactory { public static Bean2 getBean2 ( ) { Bean2 bean2 = new Bean2 ( ) ; bean2 . setMsg ( "通过【静态工厂】实例化的Bean2对象" ) ; return bean2 ; } } spring配置文件: < bean id = " bean2 " class = " com.seven.factory.Bean2StaFactory " factory-method = " getBean2 " /> 3. 通过实例工厂实例化 准备一个实例工厂: package com . seven . factory ; import com . seven . entity . Bean3 ;