此博文仅作为C++考研专业课的复习内容。

面向对象

构造函数

在对象被创建的时候将自动调用。

复制构造函数

形参是本类对象的引用。其作用是使用一个已经存在的对象,去初始化一个同类的新对象。

复制构造函数在以下三种情况会被调用。

  1. 当用类的一个对象去初始化该类的另一个对象。
Point a(1,2);
//两种写法都会调用复制构造函数,只是写法上不同。
Point b(a);//用对象a初始化b
Point c = a;////用对象a初始化b
  1. 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。
void foo(Point p){
cout<<p.getX()<<endl;
}
int main(){
Point a(1,2);
foo(a);
return 0;
}

注:值传递时调用复制构造函数,传引用时不会调用。所以传递比较大的对象时,传递引用效率会更高。

3. 如果函数的返回值是类的对象,函数执行完成返回调用者时。

Point foo(){
Point a(1,2);
return a ;
}
int main(){
Point b;
b= foo();
return 0;
}

注:a离开函数foo()时,a对象会消亡,此时会调用复制构造函数创建一个无名的临时对象存在于表达式b= foo()中。

析构函数

析构函数是用来完成对象被删除前的一些清理工作,是在对象的生存期即将结束的时候被自动调用的。

析构函数的调用执行顺序与构造函数刚好相反。

类的组合

  • 当创建类的对象时,会先初始化类中的其他对象和基本数据类型的成员变量。构造函数按以下顺序调用:
  1. 调用内嵌对象的构造函数。用顺序按照内嵌对象在组合类中定义的顺序。注意,内嵌对象在构造函数的初始化列表中出现的顺序与内嵌对象构造函数的调用顺序均无关。
  2. 执行本类构造函数的函数体。
  • 析构函数的调用执行顺序与构造函数刚好相反。析构函数的函数体执行完成后,内嵌对象的析构函数一一执行。内嵌对象的析构函数调用顺序和他们在组合类中的类定义中出现的次序刚好相反。
  • 类的拷贝构造函数编写。需要为内嵌成员对象的复制构造函数传递参数。
class Point{
public:
Point(Point& p);
};
class Line{
private:
Point p1,p2;
public:
Line(Point& p1,Point& p2);
};
Line::Line(Point& xp1,Point& xp2):p1(xp1),p2(xp2){
//to-do something
}

前向引用申明

class B; //前向引用申明
class A{
public:
void foo(B b);
};
class B{
public:
void bar(A a);
};

当类发生循环依赖时,需要使用前向引用申明。但是即便是存在前向引用申明,但是无法直接定义类的对象。

类的静态成员

静态数据成员

static修饰。类属性是描述类的所有对象共同特征的数据项,对任何实例,他的属性值是相同的。

class Point{
public:
Point(){
count++;
}
void show_count(){
cout<<count<<endl;
}
private:
static int count;
};
int Point::count = 0;

静态数据成员单独在类外初始化,需要专门为他们分配空间。

静态函数成员

静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态成员必须通过对象名。

class A{
public:
static void foo(A a);
private:
int x;
};
void A::foo(A a){
cout<<x; //对x的引用时错误的。
cout<<a.x; //正确。
}

友元

友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。

友元的特点

  • 友元关系无法传递。
  • 友元关系是单向的。
  • 友元关系不能被继承。

友元函数

友元函数是在类中用关键字friend修饰的非成员函数。可以是普通函数,也可以是其他类的成员函数。类的友元函数可以通过对象名访问类的私有和保护成员。

class Point{
Point(int x,int y);
int getX();
int getY();
friend float dist (Point &p1,Point &p2);
private:
int x,y;
};
float dist(Point &p1,Point &p2){
double x = p1.x - p2.x;
double y = p1.y - p2.y;
return static_cast<float>(sqrt(x * x + y * y));
}
int main(){
Point p1(1,1),p2(4,5);
cout<<dist(p1,p2);
return 0;
}

友元类

同友元函数一样,一个类也可以将另一个类声明为友元类。若A类为B类的友元类,则A类的所有成员都是B类的友元函数,都可以访问B类的私有和保护成员

class A{
public:
int getX();
friend class B; //B是A的友元类
private:
int x;
};
class B{
public:
void set(int i);
private:
A a;
};
void B::set(int i){
a.x = i; //由于B是A的友元类,所以在B的成员函数中可以访问A类对象的私有成员。
};

共享数据的保护

常对象

数据成员值在对象的整个生存期间内不改变。常对象必须进行初始化,而且不能被更新。

const A a(3,4);

用const修饰的类成员

  1. 常成员函数

类型说明符 函数名 (参数列表) const

eg: void foo() const;

  • 定义和申明时都要带const关键字。
  • 常对象只能调用常成员函数。
  • 无论是否通过常对象调用常成员函数,在函数调用期间,目的对象都被视为常对象,因此常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用其非const修饰的函数。
class A {
public :
void foo() const{
cout<<"foo const"<<endl;
this->bar();//error C2662: “A::bar”: 不能将“this”指针从“const A”转换为“A &
this->x = 1;//error C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改
}
void bar(){
cout<<"bar"<<endl;
}
private :
int x;
};
  • const可以区分函数的重载。例如申明如下函数。

void print();

void print() const;

此时常对象会调用第二个,非常对象就近调用第一个。
  1. 常数据成员

    常数据成员只能通过构造函数的初始化列表来指定具体值
class A {
public :
A(int i):a(i){
//a = i; //error
}
private :
const int a;
static const int b;
//static const int b = 10; //正确 int或enum的静态常量可在类中直接指定值。
};
const int A::b = 10;
  1. 常引用

    所引用的对象无法更新。

    需要注意的是:
  • 非const的引用只能绑定到普通对象,但常引用可以绑定到常对象。
  • 常引用对象,通过该引用访问时,只能把对象当做常对象。(不能修改数据成员和调用非const成员函数)

C++面向对象的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  3. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  4. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  5. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

  6. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  7. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  8. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  10. .NET基础拾遗(2)面向对象的实现和异常的处理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. Linux_10个需要了解的Linux网络和监控命令(转)

    源文地址:http://www.linuxde.net/2013/10/15325.html 1. hostname hostname 没有选项,显示主机名字 hostname –d 显示机器所属域名 ...

  2. Flume_常见的几个问题

    在HDFS的文件默认生成文件大小1K,如何设置文件大小和数量 拷贝一份flume-conf.properties.template改名为hive-mem-size.properties hive-me ...

  3. java学习中一些疑惑解答(2)

    (一)继承条件下构造方法的调用 以下面的源代码为例: package ktdemo; class Grandparent { public Grandparent() { System.out.pri ...

  4. JQuery 获取父级元素、同级元素、子元素等

    例: <div> <div id="div_1">这是内容1</div> <div id="div_2">这是内 ...

  5. window.location.href 中文乱码问题。。。。

    window.location.href 中文乱码问题.... 要解决此问题需要两次解码, 第一次解码: 是在页面中的js脚本中解码:window.location.href = "save ...

  6. es6入门教程完整版

    ECMAScript 6入门 <ECMAScript 6入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript 6新引入的语法特性. 作者:阮一峰 授权:署名-非商用 ...

  7. python文件读取

    1.如何将一个“lessons.txt”文档一行行输出? myfile = file(‘lessons.txt’) for f in myfile.readlines(): print f myfil ...

  8. CYQ.Data 快速开发EasyUI

    EasyUI: 前端UI框架之一, 相对ExtJs来说,算是小了,这两天,抽空看了下EasyUI的相关知识,基本上可以和大伙分享一下: 官网: http://www.jeasyui.com/ 学习的话 ...

  9. Metrics.NET 项目

    Metrics.NET(https://github.com/etishor/Metrics.NET)是一个给CLR 提供度量工具的包,它是移植自Java的metrics,在c#代码中嵌入Metric ...

  10. HTML5- Canvas入门(七)

    这是本系列的最后一篇入门文章,主要是对剩余的未说明的canvas方法来逐个介绍. 首先,如果你是一名擅长矢量设计的设计师,对Illustrator或者Fireworks很熟悉的话,那你肯定知道它们有一 ...