C++面向对象
此博文仅作为C++考研专业课的复习内容。
面向对象
构造函数
在对象被创建的时候将自动调用。
复制构造函数
形参是本类对象的引用。其作用是使用一个已经存在的对象,去初始化一个同类的新对象。
复制构造函数在以下三种情况会被调用。
- 当用类的一个对象去初始化该类的另一个对象。
Point a(1,2);
//两种写法都会调用复制构造函数,只是写法上不同。
Point b(a);//用对象a初始化b
Point c = a;////用对象a初始化b
- 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。
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()中。
析构函数
析构函数是用来完成对象被删除前的一些清理工作,是在对象的生存期即将结束的时候被自动调用的。
析构函数的调用执行顺序与构造函数刚好相反。
类的组合
- 当创建类的对象时,会先初始化类中的其他对象和基本数据类型的成员变量。构造函数按以下顺序调用:
- 调用内嵌对象的构造函数。用顺序按照内嵌对象在组合类中定义的顺序。注意,内嵌对象在构造函数的初始化列表中出现的顺序与内嵌对象构造函数的调用顺序均无关。
- 执行本类构造函数的函数体。
- 析构函数的调用执行顺序与构造函数刚好相反。析构函数的函数体执行完成后,内嵌对象的析构函数一一执行。内嵌对象的析构函数调用顺序和他们在组合类中的类定义中出现的次序刚好相反。
- 类的拷贝构造函数编写。需要为内嵌成员对象的复制构造函数传递参数。
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修饰的类成员
- 常成员函数
类型说明符 函数名 (参数列表) 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;
此时常对象会调用第二个,非常对象就近调用第一个。
- 常数据成员
常数据成员只能通过构造函数的初始化列表来指定具体值。
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;
- 常引用
所引用的对象无法更新。
需要注意的是:
- 非const的引用只能绑定到普通对象,但常引用可以绑定到常对象。
- 常引用对象,通过该引用访问时,只能把对象当做常对象。(不能修改数据成员和调用非const成员函数)
C++面向对象的更多相关文章
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- .NET 基础 一步步 一幕幕[面向对象之对象和类]
对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
- .NET基础拾遗(2)面向对象的实现和异常的处理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- DSY2748*音量调节
Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...
- JAVA笔试题集(一)--JAVASE部分
红色答案为参考答案 1.从下列选项中选择正确的Java表达式(多选) A. int k=new String("aa"); B. String str=String ...
- Xcode下搭建OpenGL开发环境
#include <GLUT/GLUT.h> void display() { glClear(GL_ENABLE_BIT); glBegin(GL_POLYGON); glVertex2 ...
- Unity3D UGUI之fbx模型导入问题
在UI层添加了一个fbx的模型,但是在game模式和运行中无法看到这个fbx. Canvas上面有个Render Mode :Screen Space - Overlay.Screen Space ...
- “眉毛导航”——SiteMapPath控件的使用(ASP.NET)
今天做网站的时候,用到了SiteMapPath控件,我把使用方法记录下来,以便日后查阅以及帮助新手朋友们. SiteMapPath”会显示一个导航路径(也称为痕迹导航或眉毛导航),此路径为用户显示当前 ...
- C# WinForm 导出导入Excel/Doc 完整实例教程[使用Aspose.Cells.dll]
[csharp] view plain copy 1.添加引用: Aspose.Cells.dll(我们就叫工具包吧,可以从网上下载.关于它的操作我在“Aspose.Cells操作说明 中文版 下载 ...
- IOS网络第七天WebView-04仿网易新闻详情
*************** #import "HMViewController.h" @interface HMViewController () @end @implemen ...
- ABP理论学习之开篇介绍
返回总目录 为了和2016年春节赛跑,完成该系列博客,我牺牲了今天中午的时间来完成该系列的第一篇----开篇介绍.开篇介绍嘛,读过大学教材的同学都知道,这玩意总是那么无聊,跟考试没关系,干脆直接跳过, ...
- MyBatis(增删改查)
1.工程中引入包: mybatis-3.2.7.mysql-connector-java-5.1.22-bin 2.添加配置文件: <?xml version="1.0" e ...
- 剑指Offer面试题:12.在O(1)时间删除链表结点
一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...