15、C++ Primer 4th 笔记,类和数据抽象,友元

简介: 1、成员可以是数据,函数或类型别名(typedef定义的)。 2、const必须同时出现在声明和定义中。 3、重载的成员函数和普通函数应用相同的规则:两个重载成员的形参数量和类型不能完全相同。也可以根据const来定义。

1、成员可以是数据,函数或类型别名(typedef定义的)

2const必须同时出现在声明和定义中

3、重载的成员函数和普通函数应用相同的规则:两个重载成员的形参数量和类型不能完全相同。也可以根据const来定义。

T& display(std::ostream &os)
{
...
}
const T& display(std::ostream &os) const
{
...
}

4inline在声明和定义处指定都是合法的。

5、可以声明一个类而不定义它,这个声明有时称为前向声明(forward declaration),声明的类是一个不完全类型(incompete type)

不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用;或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。

一般用于编写相互依赖的类。

6、为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用。

7、成员函数不能定义this形参,由编译器隐含指定。成员函数的函数体可以显式使用this指针,但不是必须这么做。

有一种情况必须使用:当我们需要一个对象作为整体引用而不是引用对象的一个成员时,如一个函数返回调用该函数的对象的引用。

class1& class1::set(char c)
{
...
return *this;
}

8、在非const成员函数中,this的类型是一个指向类类型的const指针。在const成员函数中,this的类型是一个指向const类类型对象的const指针。不能从const成员函数返回指向类对象的普通引用,只能返回*this作为一个const引用。

const对象只能使用const成员,非const对象可以使用任一成员。

9、我们希望类的数据成员(包括const成员函数)可以修改,可以把它们声明为mutable

10、一般的数据或函数成员必须通过对象来访问。定义类型的成员,则使用作用域操作符来访问。

11、形参表和函数体处于类作用域中;函数返回类型不一定在类作用域中,如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外。如果返回类型使用由类定义的类型,则必须使用完全限定名。

12、名字必须在使用之前进行定义。而且一旦一个名字被用作类型名,该名字就不能被重复定义,与定义局部变量内层变量名覆盖外层变量名不同。

13、友元以friend声明,它只能出现在类定义的内部。一般把它放在类定义的开始或结尾是个好主意。

必须先定义包含成员函数的类,才能将成员函数设为友元。不必预先声明类和非成员函数来将它们设为友元。

14、类必须将重载函数集中每一个希望设为友元的函数都声明为友元。

(1) 友元的关系是单向的而不是双向的。

(2) 友元的关系不能传递。(AB的朋友,BC的朋友,但不一定AC的朋友)。

(3) 但是友元可以继承(这是我在VS编译器中测试的结果,在C++ Primier中说其不可以继承)。

示例

#include <iostream>
using namespace std;

class Data;
class Time
{
public:
Time(int,int,int);
void display(Data&);
private:
int hour;
int minute;
int sec;
};

class Data
{
public:
Data(int,int,int);
friend void Time::display(Data&);
private:
int month;
int day;
int year;
};

class Date1:public Data
{
public:
Date1(int m1, int m2, int m3):Data(m1,m2,m3)
{
cout << "In Date1" << endl;
}
};

Time::Time(int h,int m,int s)
{
hour=h;
minute=m;
sec=s;
}
void Time::display(Data& d)
{
cout<<d.month<<"/"<<d.year<<endl;
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
Data::Data(int m,int d,int y)
{
month=m;
day=d;
year=y;
}
int main()
{
Time t1(10,13,56);
Data d1(12,25,56);
t1.display(d1);
Date1 dd1(1,2,3);
t1.display(dd1);
return 1;
}

参考

[1] 友元

http://blog.163.com/zhoumhan_0351/blog/static/39954227201002621251123/

[2] 继承

http://blog.163.com/zhoumhan_0351/blog/static/3995422720100284731826/

目录
相关文章
|
7月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
172 2
|
8月前
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
303 35
|
6月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
183 0
|
6月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
277 0
|
8月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
316 12
|
10月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
9月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
183 16
|
10月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
9月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
9月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。