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)
十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...
随机推荐
- sql语句中left join、right join 以及inner join之间的使用与区别
sql语句中left join.right join 以及innerjoin之间的使用与区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join( ...
- Spring的AOP-----HelloWord
这里就一个计算器开发为例1搭建环境-搭配好Spring的AOP开发环境导入以下这些包:2建立好核心处理模块的类ArithmeticCalculator: package com.jeremy.spri ...
- PHP之冒号、endif、endwhile、endfor 是什么鬼?f
解释:其实这些都是PHP的语法,只不过不常用而已,这些都是PHP流程控制的替代语法. 冒号(:)相当于是 左大括号---->{ endif.endwhile.endfor.endforeach- ...
- Convolution Matrix
w褶积矩阵.二值化旧图经核矩阵得到新图. https://docs.gimp.org/en/plug-in-convmatrix.html 8.2. Convolution Matrix 8.2.1. ...
- find-if-an-item-is-in-a-javascript-array
http://stackoverflow.com/questions/143847/best-way-to-find-if-an-item-is-in-a-javascript-array Best ...
- android开发笔记(一)Android studio 输入法
以前都是用的时候查资料做些增添即可,现在下决心系统学习下. 首先发现developer.Android.com在开发工具上开始推出了 Android Studio了,不过他自己没有sdk manage ...
- GNU Screen使用入门
前些天开始学习使用GNU Screen程序,发现这个工具在管理服务器时候确实挺方便的,于是写一篇文章总结一下,顺便介绍Screen的基本使用方法. 简介 GNU Screen是 一个基于文本的全屏窗口 ...
- 爬虫之cookiejar模块
简介 有时候我们需要爬一些需要登录才能进入网页,这个时候就要用到cookie相关的一些模块来操作了 内置的http包里包含了cookie相关的一些模块,通过她们我们可以自动使用cookie Cooki ...
- Mybatis框架学习总结-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的. 1.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY ...
- Java 运算符及优先级
运算符 分割符: , ; [] () 算数运算符: + - * / % ++ -- 关系运算符: > < >= <= == != 逻辑运算符: ! & | ^ & ...