C++之旅:拷贝构造与友元
拷贝构造与友元
拷贝构造是在构造一个对象的时候将已有对象的属性拷贝给新的对象;友元可以让一个类的所有属性(主要是private)对特定的类开放
拷贝构造
如果没有复写拷贝构造函数,系统会帮我们默认生成改函数
#include <iostream>
using namespace std;
class Demo {
private:
int a;
public:
void set(int a) {this->a = a;}
int get() {return a;}
};
int main(int argc, char **argv) {
Demo demo;
demo.set(100);
Demo demo1 = demo; //调用拷贝构造函数
cout << demo1.get() << endl;
}
在上面的代码中,即使a是私有成员,也会将其值赋给新对象,因为拷贝构造是全员拷贝的。
Demo demo1 = demo;
上面的代码在编译时会被翻译成下面的代码(其实是=号操作符被重载了),我们也可以使用下面的代码显示的调用拷贝构造函数
Demo demo1(demo);
涉及到指针的拷贝
如果类成员中有指针,则需要自己实现拷贝构造函数,即进行深拷贝。
class Demo {
private:
char *str;
public:
Demo(){str = new char[10];}
~Demo(){delete []str;}
Demo(const Demo &demo) { //自定义拷贝构造函数
str = new char[10];
strcpy(str, demo.str);
}
};
上面的代码中新对象和旧对象中str指针将会指向不同的内存区域。如果我们不实现拷贝构造,那么编译器会简单的将旧对象中str的值赋值给新对象,这样两个对象中str将会指向同一块内存区域,比较危险
拷贝构造与赋值操作
int main(int argc, char **argv) {
Demo demo;
Demo demo2;
demo2 = demo; // 不会调用拷贝构造
Demo demo3 = demo; // 调用拷贝构造
}
在main函数的第三行代码中只是发生了赋值操作,即将demo对象中所有的属性赋值给demo2,并不会调用拷贝构造函数(这里可能会引起内存泄露);在第四行代码中将会发生拷贝构造
友元
友元类
友元是将自己本来不想开放的属性和方法对特定的类进行开放。
**友元关系是单向的,且友元关系不具备传递性"
#include <iostream>
#include <cstring>
using namespace std;
class Demo {
private:
char *str;
void test(){cout << "this is demo" << endl;}
friend class Demo1;
};
class Demo1 {
public:
Demo1(){Demo demo; demo.test();}
};
int main(int argc, char **argv) {
Demo1 demo1;
}
上面的例子中Demo将Demo1设为自己的友元,所以在Demo1可以访问Demo中的私有属性。
友元方法
#include <iostream>
#include <cstring>
using namespace std;
class Demo {
private:
char *str;
void test(){cout << "this is demo" << endl;}
friend void test();
};
void test() {
Demo demo;
demo.test();
}
int main(int argc, char **argv) {
test();
}
将某个方法设置为自己的友元方法,但是在面向对象编程中一般很少用到友元方法
C++之旅:拷贝构造与友元的更多相关文章
- C++拷贝构造&操作符重载
头文件 DString.h如下 #ifndef __DSTRING_H #define __DSTRING_H #endif #include <stddef.h> class DStri ...
- c++拷贝构造和编译优化
#include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int i); My ...
- C++ 构造函数、析构函数、拷贝构造、赋值运算符
之所以要把它们放在一起,是因为在使用C/C++类语言的时候,很容易混淆这几个概念(对Java来说完全没有这样的问题,表示Javaor完全没有压力). 先建立一个测试类(包含.h和.cpp) //~ P ...
- c++ 拷贝构造练习
#include<iostream> using namespace std; class Vector { private: int *dwp; int size; void clone ...
- C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)
1.构造函数: >构造函数是一个特殊的.与类同名的成员函数,用于给每一个成员设置适当的初始值. >构造函数不能有返回值,函数名与类名同样. >缺省构造函数时,系统将自己主动调用该缺省 ...
- C++对象的构造、析构与拷贝构造
今天下午在研究虚函数的时候遇到了一个问题,觉得很有意思,记录一下. 先看代码: class Base { public: Base(int value) { m_nValue = value; cou ...
- 重点:QObject 的拷贝构造和赋值操作——私有
QObject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域.因此所有继承 ...
- C++ 进阶5 拷贝构造 深度复制 运算符重载
C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * * Created on: 2013年10月26日 * ...
- 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)
十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...
随机推荐
- win7win8 64位汇编开发环境合集安装与设置
win7win8 64位汇编开发环境合集安装与设置 下载 win7 win8 64位汇编开发环境.rar 下载地址(免积分下载) http://download.csdn.net/detail/li ...
- Java Tomcat 注册为Windows系统服务
注册方法: 1. 在DOS命令行模式下,cd到tomcat的bin目录下 cd tomcatpath 根目录加:后回车 进入到tomcat安装目录,cd bin,进入tomcat启动目录 2.在tom ...
- laravel 配置修改及读取
1)laravel 的所以配置文件都在根目录下的 config 目录里,直接看一个配置文件的名字就知道是做什么的了,这里不说了 2)读取配置的方法 $value = config('app.timez ...
- Android下在onCreate中获取控件的宽度和高度(通过回调)
有时候需要在onCreate方法中知道某个View组件的宽度和高度等信息, 而直接调用View组件的getWidth().getHeight().getMeasuredWidth().getMeasu ...
- 教你如何在 Android 使用多线程下载文件
# 教你如何在 Android 使用多线程下载文件 前言 在 Android 日常开发中,我们会经常遇到下载文件需求,这里我们也可以用系统自带的 api DownloadManager 来解决这个问题 ...
- tortoiseSVN如何回滚(切换至)某个历史版本?
tortoiseSVN如何回滚(切换至)某个历史版本? 1.右键需要回滚的项目,tortoiseSVN - >show log 2.右键需要回滚的历史版本,选择revert to this re ...
- [Chrome] 如何下载老版本的 Chrome
Google 官方只提供了最新版的 Chrome, 在旧版本的系统(如:Ubuntu 12.04 LTS)安装不上 这里提供了 Chrome 的历史版本下载 备注:Ubuntu 12.04 LTS 可 ...
- HDU 3333 Turing Tree (线段树)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- jQuery table tr隔行变色,鼠标移入移出变色,鼠标点击变色
.trover { background: #f9f9f9; } .trclick { background: #c4e8f5; } .treven{ background:#CCFFCC; } .t ...
- Python--格式化输出%s和%d
https://www.cnblogs.com/claidx/p/7253288.html pythn print格式化输出. %r 用来做 debug 比较好,因为它会显示变量的原始数据(raw d ...