当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的,即使静态类型与动态类型不一致: #include <iostream> using namespace std; class A{ public: // A(); // ~A(); ostream& print(ostream& os) co…
类里面的成员变量可以用const修饰,在只用const不用static修饰的情况下,这种使用的限制比较多 (1)不能定义处初始化,必须在类的构造函数初始化列表里面初始化(虽然在vs中,可以在定义处初始化,但是这是不符合语法的,如果用g++编译器,就会出现明显的报错,不利于程序的移植) class constNum{ //const int size=10; 错误,不能在定义处对const成员变量进行初始化 const int size; public: constNum(); }; constN…
派生类和基类的概念及派生类构造函数的原理: 创建一个叫做TableTennisPlayer的基类,记录会员的名字和是否有球桌. //声明一个基类 class TableTennisPlayer { private: string firstname; string lastname; bool hasTable; public: TableTennisPlayer(); void Name() const; bool HasTable() const {return hasTable;}; vo…
<面向对象程序设计基础(第二版>李师贤等,第254页:C++语言的基本规则是:创建一个派生类的对象时,如果基类带有构造函数,则先调用基类的构造函数,然后才调用派生类的构造函数. <Thinking in C++>,刘宗田等译,第261页:可以看出,构造在类层次的最根处开始,而在每一层,首先调用基类构造函数,然后调用成员对象构造函数. <C++ Primer Plus(第四版)中文版>,孙建春等译,第399页:记住:创建派生类对象时,程序首先调用基类构造函数,然后再调用派…
 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以下: #include<iostream> //假设声明已经定义.边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.另外一种初始化的…
类作用域: (1)成员函数在类外定义时,因为函数体还有形参列表都出现在成员名之后,都是在类作用域内定义,所以不用加域作用符 来引用其他的成员. (2)函数的返回值不一定需要在类的作用域中,但是若是返回类中定义的类型,则必须完全加上域作用符来限定,如: class1::type1 (3)类作用域中的名字查找:首先在使用该名字的块中查找名字的声明,只考虑在该项使用之前声明的名字.若是找不到名字 则在包围的作用域中查找. 构造函数: (1)构造函数可以被重载,而实参将决定使用哪一个构造函数 (2)构造…
static局部变量 static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化 这种对象一旦被创建,在程序结束前不会被撤销.在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值. #include<iostream> #include<string> #include<assert.h> using namespace std; size_t count_calls() { ; return ++ctr; } int main() {…
C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!下面我们就来具体看看类中的static数据成员! 谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成…
建议40: 匿名类的构造函数很特殊 在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行加减乘除运算,代码如下: // 定义一个枚举,限定操作符 enum Ops { ADD, SUB } class Calculator { private int i, j, result; // 无参构造 public Calculator() { } // 有参构造 public Calcula…
4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co…
3.8  友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的成员,包括私有成员.保护成员和公有成员.在类中声明友元函数时,需在其函数名前加上关键字friend,此声明可以放在公有部分.也可以放在保护和私有部分.友元函数可以定义在类部,也可以定义在类的外部. 3.8.1 将非成员函数声明为友元函数 //1.将非成员函数声明为友元函数 // 例3.33 友元函数…
构造函数的调用顺序是先调用System.Object,再按照层次结构由上向下(基类=>派生类)进行,直到到达编译器要实例化的类为止.在此过程中,每个构造函数都初始化自己类中的字段.编译器先自下而上查找构造函数,然后再自上而下地执行. 以下通过示例说明派生类的构造函数是如何执行的. 1.基类和派生类都未显示定义构造函数 执行GenericCustomer customer = new Nevermore60Customer();语句时,编译器首先找到试图实例化的类的构造函数即Nevermore60…
派生类不能继承基类的构造函数,若想通过派生类来对基类的private的变量成员进行初始化则需要: 通过派生类的构造函数来调用基类的构造函数完成基类成员变量的初始化. 看下面的例子: #include <iostream> #include<string> using namespace std; class People { private: char *m_name; int m_age; public: People(char*, int); }; People::People…
面向对象是(OOP)是特殊的.设计程序的概念性方法:包含以下特性: 抽象: 封装和数据隐藏: 多态: 继承: 代码的可重用性: 为了实现这些特性并且将这些特性组合在一起,C++所做的最重要的改进是提供了类. l  如何定义类: l  如何为类提供公有部分和私有部分: l  如何创建使用类数据的成员函数: l  构造函数和析构函数是什么?是特殊的成员函数:创建和删除属于当前类的对象: l  this指针: l  运算符重载和继承,代码重用的基础: =========================…
本文要点: 1.static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联! aka:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系! 2.static数据成员是存储在程序的静态存储区,而并不是在栈空间上 3.不能对static数据成员在类内部进行初始化,要初始化的话必须在类外进行定义.如果类中有多个static数据成员,static数据成员初始化的次序是按照static数…
分类 --友元.static成员 一.友元 友元机制同意一个类将对其.友元关系:一个样例 如果一个窗体管理类Window_Mgr可能须要訪问由其管理的Screen对象的内部数据.Screen应该同意其訪问自己的私有成员: class Screen { friend class Window_Mgr; }; Window_Mgr的成员能够直接引用Screen的私有成员: Window_Mgr & Window_Mgr::relocate(Screen::index x,Screen::index…
1,类和对象 定义一个类,本质上是定义一个数据类型的蓝图.这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作. 类定义格式如下: class Box { public: //在类对象作用域内,公共成员在类的外部是可访问的. double length; // 盒子的长度 double breadth; // 盒子的宽度 double height; // 盒子的高度 }; 声明类对象: Box Box1; // 声明…
题目:用C++设计一个不能被继承的类. 分析:这是Adobe公司2007年校园招聘的最新笔试题.这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目. 在Java中定义了关键字final,被final修饰的类不能被继承.但在C++中没有final这个关键字,要实现这个要求还是需要花费一些精力. 首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数.同样,子类的析构函数也会自动调用父类的析构函数.要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函…
在c++11中,static静态类对象在执行构造函数进行初始化的过程是线程安全的,有了这个特征,我们可以自己动手轻松的实现单例类,关于如何实现线程安全的单例类,请查看c++:自己动手实现线程安全的c++单例类.下面给出一个验证例子: 1.清单1:staticSafe.h #include <iostream> #include <thread> using namespace std; class Cnum { public: Cnum() { std::cout <<…
一.不能自动继承的成员函数 构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化(调用基类构造函数完成). 派生类的构造函数需要给基类的构造函数传递参数  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35…
0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法: 在类中以friend关键字声明友元 类的友元可以是其它类或者具体函数 友元不是类的一部分 友元不受类中访问级别的限制 友元可以直接访问具体类的所有成员 友元的语法--在类中用friend关键字对函数或类进行声明: 示例一: #include <stdio.h> #include <mat…
1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所属的类类型.非static成员被限定声明为其自身类对象的指针或引用.    class Bar{ public:    //     private: static Bar mem1; //ok       Bar *mem2;//ok       Bar &mem3;//ok Bar mem4;/…
0. 使用背景 对于特定类类型的全体对象而言,访问一个全局对象有时是必要的.也许,在程序的任意点需要统计已创建的特定类类型对象的数量:或者,全局对象可能是指向类的错误处理例程的一个指针:或者,它是指向类类型对象的内在自由存储区的一个指针.然而,全局对象会破坏封装:对象需要支持特定类抽象的实现.如果对象是全局的,一般的用户代码就可以修改这个值. 1. static 类成员 类可以定义类 静态成员,而不是定义一个可普遍访问的全局对象.通常,非 static 数据成员存在于类类型的每个对象中.不像普通…
一.类声明 //类是一种用户自定义类型,声明形式: class 类名称 {    public:              公有成员(外部接口)    private:              私有成员    protected:              保护成员 }; 在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数. 在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问. 在关键字protected后面声明,与p…
const成员函数作用1. 不能修改类的成员变量,同时不能调用类的非const成员函数.(const成员函数中,this的类型是一个指向const类类型对象的const指针,const成员函数返回*this作为一个const引用).2. 提供了基于const的重载.const对象只能使用const成员函数.非const对象可以使用任一成员,但非const版本是一个更好的匹配. const形参:仅当函数形参是引用或指针时,可基于形参是指向const对象还是指向非const对象,实现函数重载.如果传…
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public HelloA(){//构造函数 } 关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的.2.构造函数的作用是用于给对象进行初始化.3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次. 构造代码块 {//构造代码块 }…
C++ static 函数的问题 近日读 C++ primer 中static 一章 , 有这么一句话, “静态成员函数的声明除了在类体中的函数声明前加上关键字static 以及不能声明为const 或volatile 之外与非静态成员函数相同出现在类体外的函数定义不能指定关键字static” 为什么不能在类体外指定关键字static , 这样设计的目的是什么,有什么用处? 2# 怎么说呢, 这是一个作用域的问题!成员函数的作用域是类域, 而在类体外加上static不是表示静态函数,表示的是函数…
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助.                                         c++类的构造函数详解 一. 构造函数是干什么的 class Counter{ public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类型 …
C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 3.完善实验室的研究项目,为毕业设计做准备 有了这三个安排之后,就可以把一天的时间大致分为三份了.对于C++ 知识点的学习这部分,主要是看<C++ Primer>以及本科使用的英文教材<C++:How to program>来进行,今天主要探索一下C++ 中类的构造函数. 类简介 什…
建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { List l1 = new ArrayList(); List l2 = new ArrayList(){}; List l3 = new ArrayList(){{}}; System.out.println(l1.getClass() == l2.getClass()); System.out.pri…