一:若没有显示写构造函数,默认会有一个默认构造函数(无参),若自己构造后,不会存在这个默认构造函数

二:类成员若是有const修饰,必须在对象初始化的时候,为该类成员赋值(或者一开始就定死,同C中)

class A
{
private:
const int a = 11; //直接定死
const int b;
const int c;
public:
A(int a1,int a2) :c(a2),b(a1) //构造之前的声明:注意成员变量的初始化顺序和声明的顺序相关-->先是c后是b
{
//this->b = a1; //这样是不允许的,这是再赋值修改,只能在声明中修改
} void getInfo()
{
cout << "a:" << a << endl;
cout << "b:" << b << endl;
cout << "c:" << c << endl;
}
}; void main()
{
A a(,);
a.getInfo();
system("pause");
}

三:类成员是对象声明时,必须在构造函数中进行初始化(同二)

class B
{
private:
int a, b, c;
public:
B()
{
cout << "调用默认构造" << endl;
} B(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
} void getInfo()
{
cout << "a:" << a << endl;
cout << "b:" << b << endl;
cout << "c:" << c << endl;
}
}; class A
{
private:
const int c;
B b; //在类中是变量声明,不会进行构造为对象
public:
A(int a1,int a2,int a3):b(a1,a2,a3),c(a1)
{
//this->b = a1; //这样是不允许的,这是再赋值修改,只能在声明中修改
} void getInfo()
{
cout << "c:" << c << endl;
b.getInfo();
}
}; void main()
{
A a(,,);
a.getInfo();
system("pause");
}

四:构造和析构调用顺序

.当类中有成员变量是其他类的对象时,必须先调用成员变量的构造函数,调用顺序与声明顺序一致,之后才会调用自己的构造函数
.析构函数调用顺序与对应的构造函数调用顺序相反

五:补充---友元函数(破坏封装性)

(一)友元函数不受访问限制符影响

(二)友元函数是在类外部的一个函数。可以通过对象参数访问私有数据成员

(三)友元函数使用

class A
{
private:
const int c;
int af=; //设置友元函数声明 不受访问限制符影响
friend void FriendSet(A *ptr, int n); //第一个参数代表当前对象,其他自己设置
//类似于在外部设置一个函数接口,可以让所有用户进行修改访问
//但是不受访问修饰符限制,类的封装性丢失

public:
A(int a1,int a2,int a3):c(a1)
{
} void getInfo()
{
cout << "c:" << c << endl;
cout << "af:" << af << endl;
}
}; void FriendSet(A *ptr, int n) //第一个参数代表当前对象  在类的外部实现
{
ptr->af = n;
}
void main()
{
A a(,,);
FriendSet(&a, );
a.getInfo();
system("pause");
}

六:补充---友元类(破坏封装性)

若B类是A类的友元类,则B类的所欲成员函数都是A类的友元函数
class A
{
private:
const int c;
int af=;
friend class B;  //也是不受访问限制符影响
public:
A(int a1,int a2,int a3):c(a1)
{
} void getInfo()
{
cout << "c:" << c << endl;
cout << "af:" << af << endl;
}
}; class B
{
private:
A Aobj;  //这是声明,必须在构造函数中进行初始化
public:
void Set(int i)
{
Aobj.af = i; //可以直接访问私有
} B() :Aobj(10, 11, 12) //必须设置构造函数
{ } void Get()
{
cout << "c:" << Aobj.c << endl;
cout << "af:" << Aobj.af << endl;
}
}; void main()
{
B Bobj; //会调用构造函数
Bobj.Set();
Bobj.Get();
system("pause");
}

C++回顾day02---<对象构造和析构,外加友元函数>的更多相关文章

  1. c++入门之—运算符重载和友元函数

    运算符重载的意义是:将常见的运算符重载出其他的含义:比如将*重载出指针的含义,将<<与cout联合使用重载出输出的含义,但需要认识到的问题是:运算符的重载:本质仍然是成员函数,即你可以认为 ...

  2. Swift教程之运算符重载

    http://blog.csdn.net/mengxiangyue/article/details/43437797 原文地址:http://www.raywenderlich.com/80818/o ...

  3. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  4. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  5. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  6. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

  7. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  8. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  9. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  10. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

随机推荐

  1. docker资料---仓库搭建

    以下步骤均为本人亲自踩坑,历经数次失败,最终搭建成功 一.环境信息: 操作系统:CentOS 7 Docker版本:1.12.5 (更高版本应该类似) registry:2.4.1 registry- ...

  2. HDU5384-Hotaru's problem-Manacher

    找出紧挨的三个回文串,例如abccbaabc ,形如ABA格式,其中AB为回文串.计算最长的长度. 首先用Manacher处理回文半径.然后就是找到两个点,都是偶数的回文串,并且共享了中间一段. 之后 ...

  3. windows 环境下通过运行快速启动程序

    在windows环境下,我们可以使用一些系统内置的快捷键来快速启动我们想要的应用程序,我这里举例几个我经常使用的,比如: 快捷键 功能说明 services.msc  查看系统服务 gpedit.ms ...

  4. LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】

    题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...

  5. 洛谷p2661信息传递题解

    题目 这个题一眼看上去就是用并查集求最小环. 我们可以设两个数组分别是f,d分别表示该点的爸爸和该点到祖先的距离. 当该点的爸爸等于他时,那他肯定就是祖先. 此时信息就肯定传递完了,此时的整个图中(我 ...

  6. 【XSY2032】简单粗暴的题目 组合数

    题目描述 给你\(n,k,a_1\ldots a_n\),设 \[ ans_n=\sum_{i=1}^n{(\sum_{j=i}^ns(j))}^k\\ \] 求\(ans_1\ldots ans_n ...

  7. 【BZOJ3669】【NOI2014】魔法森林 LCT

    题目描述 给你一个\(n\)个点\(m\)条边的图,每条边有两个边权\(a,b\).请你找出从\(1\)到\(n\)一条路径,使得这条路径上边权\(a\)的最大值\(+\)边权\(b\)的最大值最小. ...

  8. 【XSY1580】Y队列 容斥

    题目大意 给你\(n,r\),求第\(n\)个不能被表示为\(a^b(2\leq b\leq r)\)的数 \(n\leq 2\times {10}^{18},r\leq 62\) 题解 我们考虑二分 ...

  9. python_getpass 模块的使用

    可以实现输入用户密码的时候隐藏输入显示.更加安全. 默认自带Password: 的提示 如果自己指定提示内容就用自己的替换默认 import getpass passwd = getpass.getp ...

  10. Eslint检测出的问题如何自动修复

    1. sublime 插件 eslintAutoFix 目前只试了windows下 真是大坑!如果你用了这个插件但不能自动修复,那就不要再用这个了!全网无解! 提示系统找不到指定的文件,各种路径加入系 ...