与封装性何干?

STM32F103VCT6+W5500 TCP 服务端通信 STM32F103VCT6 W5500的TCP连接通讯的程序 阅读详情

刚刚看到的一篇文章,关于C++的封装性(http://blog.youkuaiyun.com/ac1998/archive/2006/10/08/1326184.aspx),大致明白了作者的意思,只是觉得文中所提到的问题与封装性没什么关系,另外有的地方遣词用句让人误会,比方说这句:调用者看到了private里面的具体实现的细节!——这极大破坏了封装性。破坏了一个基本的OO原则。Java、C#、Delphi都有同样的private或protected,难道因为在private里面放了字段就破坏了封闭性吗?这个显然说不过去。

但我猜想,作者的意思应该是:由于C++用了分离模式进行编译和链接,所以,对于实现的任何改动,只要涉及到内存布局的改动,则实现者必须重新发布头文件。

从上述观点来看,只要保证以下几点中的任意一点,就可以避免文中提到的问题:

  1. 只提供接口(纯虚类)
  2. 实现可以变,但内存布局不能变,不再增加和减少成员变量
  3. 避免分离编译和链接,所有函数均用内联

一、只提供接口

这样保证了只针对接口进行编程,但同时也使得对象无法在栈上被构造(在栈上构造有很多方便的地方,如离开作用域自动析构、不会生成内存碎片、速度快效率高等),而且必须提供相应的工厂,这样就增加了编程的难度,事实上,我还没有看到过哪个项目全用纯虚类的。

二、不改变成员变量的个数

用一种惯常的桥接手法,可以保证无论实现怎么变,类的成员变量个数都不变:


// foo.h
class FooImpl;
class Foo {
public:
Foo();
~Foo();
void funcA();
int funcB(int param);
...
private:
FooImpl * impl;
};

// foo.cpp
class FooImpl {
public:
void funcA() { ... }
int funcB(int param) { ... }
...
private:
...
...
};

Foo::Foo() : impl(new FooImpl) {}
Foo::~Foo() { delete impl; }
void Foo::funcA() { impl->funcA(); }
int Foo::funcB(int param) { return impl->funcB(param); }

 这种方式提供了一种灵活性,使对象可以被直接构造(无论是在栈上还是在堆上),但由于每一个成员函数都必须以CPP里被委托给Impl,要保证没有委托给错误的方法,只有靠人肉来保证,编译器没办法知道(除非委托给一个参数完全不同的方法),而且有的性能捍卫者会因为委托无法被内联而不愿意用这种手法(无论多小的函数,setter和getter都没办法内联在Foo.h里,都会有函数CALL的开销)。

三、避免分离编译和链接,所有函数均用内联

对于较小的类可以这样,对于较大的类,或者不愿意提供实现方法源代码,就不太适合了。


 总之,觉得文中想说的东西与“C++的封装性”一点关系也没有,如果全用内联,所有实现都写在头文件里,暴露的信息更多,反而可以完全避免文中所提到的问题,与封装性何干?

一步一步教你如何安装IP-Guard(客户端WINDOWS篇) 1、安装完服务器后,在服务器右下角有一个IP-GUARD图标:如图 2、点图标右键选注册: 3、注册成功后, 4、在开始菜单里选生成客户端安装包。 5、生成客户端安装包成功,安装名字可以任意,但是最好是英文名字。 6、将客户端安装程序复制到桌面。 7、退出所有杀毒软件、安全卫士、电脑管家等然后运行 8、安装完成后,立即重启计算机。IPguard客户端安装完成。 9、这样在控制里就可以看到已经安装客户端的计算机,在线显示蓝色,灰色表示计算机已经离线货关机 ... 阅读详情

相关推荐

电力电子技术速通复习

一种完全纯净,结构完整的半导体晶体,其含有两种载流子而且,自由电子的浓度和空穴的浓度总是相等,一般情况下,在硅晶体中掺入P(磷)五价元素,多子为自由电子,少子为空穴;在硅晶体中掺入B(磷)三价元素,多子为空穴,少子为自由电子;6.PN结具有单相导电性,PN结具有雪崩击穿(T越高,击穿电压越大)和齐纳击穿(T越高,击穿电压越小),均可逆,热击穿不可逆;PN结具有电容效应,势垒电容(耗尽层变化等效的电容)扩散电容(非平衡少子引起的电荷量的变化等效出来的电容效应)

qq_62873973的博客 2507

004-封装性原理与实现

本文摘要: 《封装性原理与实现》是一篇面向对象编程的中级教程,重点讲解封装性概念、实现技术与最佳实践。文章首先定义了封装性作为OOP三大特性之一的核心原则,包括信息隐藏、接口统一、访问控制和数据保护。然后详细比较了Java和C++中的访问控制修饰符(public/protected/private/default)及其应用场景。教程提供了丰富的代码示例,展示属性封装的Getter/Setter标准模式、数据验证逻辑和不可变对象设计。文章还强调封装性在类接口设计中的重要性,指导开发者如何构建安全、清晰的API

wyl703的博客 1347

新手避坑指南:从GEO数据库下载单细胞测序数据的5个关键步骤(附实操截图)

本文为单细胞测序数据下载新手提供5个关键避坑步骤,涵盖数据搜索准备、样本量评估、文件选择决策、元数据诊断及高效下载技术。通过实操截图和代码示例,帮助研究者快速锁定GEO数据库中的优质单细胞测序数据,避免常见错误。

weixin_30296405的博客 671

Java类的三大特性之一:封装性

阿萨德大奥所

瓦坎达会议室 6776

快速配置ORCAD导出智能PDF原理图

在OrCAD 中导出类似Altium Designer的智能PDF(即交互式PDF);

QingNing3028的博客 3951

【科技前沿】用深度强化学习优化电网,让电力调度更聪明!

Hey小伙伴们,今天我要跟大家分享一个超级酷炫的技术应用——深度强化学习在电网优化中的典型案例!如果你对机器学习感兴趣,或是正寻找如何用AI技术解决实际问题的方法,这篇分享绝对不容错过!👩‍💻✨

Jacklx888的博客 3247

如何理解封装性

​C++是为了解决编写大程序过程中的困难而产生的。对象:客观世界中任何一个事物都可以看成一个对象( object )。对象组成:数据——描述对象的属性函数——行为(操作代码),根据外界给的信息进行相应操作的代码外界给的信息进行相应操作的代码。具有相同的属性和行为的对象抽象为类(class )类是对象的抽象对象则是类的特例。

m0_71616132的博客 843

1、深入解析OTA/gm - C滤波器架构与设计

本文深入探讨了OTA/gm-C滤波器的架构与设计方法,涵盖了从基本构建模块到高阶滤波器实现的多种技术。重点分析了双积分器环路结构(如Tow-Thomas和KHN滤波器)的工作原理、性能特点及OTA非理想特性对滤波器的影响,并介绍了降低寄生效应、提升动态范围的方法。文章还讨论了基于LC梯形仿真、多环反馈和电流模式的gm-C滤波器设计,以及自动调谐技术在频率稳定性中的应用。最后总结了不同类型gm-C滤波器的优缺点及其适用场景,为高频集成连续时间滤波器的设计提供了全面的技术参考。

fanta的博客 185

什么是封装性?C++中如何实现封装? 封装性的好处是什么?

封装性是面向对象编程中的一个重要特性,它将数据和操作数据的方法封装在一个类中,使得类的内部实现细节对外界隐藏起来,只通过特定的接口与外界进行交互。例如,如果一个类的内部数据存储方式从数组改为链表,只要公共的方法(如获取数据、设置数据等)的行为不变,外部使用这个类的代码就不需要进行任何修改,大大提高了代码的可维护性。例如,如果一个类的内部使用了特定的数据结构来存储数据,外部代码不知道这个数据结构的具体实现,就不会错误地直接操作这个数据结构,从而避免了可能导致的错误。

SUN_Gyq的博客 1436

使用Python爬虫获取Facebook帖子和评论数据

Web爬虫是用于自动抓取网页数据的程序。它通过发送HTTP请求,获取网页的HTML源代码,再对源代码进行解析,提取所需的内容。爬虫常用于数据收集、信息提取、数据分析等应用。

2201_76125261的博客 1999

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4012

封装性

/* 面向对象的特征一:封装与隐藏 3W:what? why? how? 一、问题的引入: 当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到 属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值 加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setLegs()) 同时,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为

qq_45608338的博客 507

基于Simulink的PID控制汽车巡航控制系统建模与仿真

汽车巡航控制系统(Cruise Control System)是一种通过自动调节发动机输出功率来维持车辆以恒定速度行驶的技术。这种系统能够减轻驾驶员在长途驾驶中的疲劳,同时提高燃油经济性和行车安全性。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于汽车巡航控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的汽车巡航控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 196

Java三大特性的第一个分水岭——封装性

本篇主要讲解Java面向对象的三大特征之一:封装性。 从设计思想、权限修饰符、作用范围、使用细节代码举例来让大家学会封装性!

知识记录 4131

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

关于c++的封装性

关于c++的封装性 在头文件中定义一个类, 比如说CAlpha。然后用mfc把整个类输出来(在DLL中),供别人调用这个类。听起来,这个解决方案很不错,模块化,实现部分进行了封装。但我们实际来看这个例子://my_header.hclass CAlpha{private:           int m_nDegree;public:          in

ac1998的专栏 3766

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【JavaSE】类与对象--封装性

封装性是面向对象编程中的三大特征之一,封装性就是把对象的成员属性和成员方法结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节。

weixin_50486535的博客 1925

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java 封装性详解

封装性是 Java 面向对象编程中的重要概念,它有助于提高代码的质量和可维护性。通过合理使用权限修饰符、构造器以及正确的实例变量赋值顺序,可以更好地实现封装,使代码更加安全、可靠。在实际开发中,我们应该充分利用封装性的优势,遵循良好的编程规范,提高软件的质量。

qq_69304031的博客 1440

C++封装性

C++面向对象三大特性:继承,封装,多态。

2301_78814687的博客 432

(Java)封装性

文章目录一、封装性二、注意 一、封装性 所谓的封装性就是指对外部不可见 为属性封装:private 属性类型 属性名称; 为方法封装:private 方法返回值 方法名称(参数列表){} 为程序加上封装性: class Person{ private String name; private int age; public void tell(){ Sys...

南淮北安的博客 1081

什么是封装性?C++中如何实现封装?封装性的好处是什么?

封装性的定义封装性是面向对象编程(OOP)中的一个核心概念,它指的是将数据和操作这些数据的函数或方法结合在一起,形成一个不可分割的整体(即类)。这种结合使得对象的内部状态只能通过类提供的接口(即公有成员函数)来访问和修改,从而提高了程序的安全性和可维护性。C++中实现封装的方法在C++中,封装通常通过类和对象来实现。定义类:首先,需要定义一个类,这个类将包含要封装的数据(成员变量)和与这些数据相关的操作(成员函数)。声明成员变量:在类的定义中,可以声明一些成员变量来存储数据。

rujiran的博客 605

Java的封装性

Java的封装性(Encapsulation)是面向对象编程(OOP)的四大基本特性之一,它指的是将数据(属性)和作用于数据的操作(方法)封装在一起,作为一个独立的单元(即类)。封装隐藏了对象的属性和实现细节,仅对外公开接口,使得用户只能通过接口来访问对象,从而保证了数据的安全性和完整性。

weixin_61468920的博客 682

封装性private,

转载请表出出处

weixin_60936436的博客 639

封装性与构造器说明

引入封装性原因? 程序设计追求“高内聚,低耦合”。 高内聚:类的内部数据操作细节由自己完成,不允许外部干涉; 低耦合:仅对外暴露少量的方法用于使用。 隐藏对象内部的复杂性,对外只公开简单的接口,便于外界调用,提高系统的可扩展性,可维护性。即把该隐藏的隐藏起来,该暴露的暴露出来,即为封装性的设计思想。 问题引入? 一个类创建自己的对象后,可以通过“对象名.属性”来为属性值赋值。赋值操作会受到数据类型和存储范围的制约,除此之外,没有其他的限制。而在实际问题中,往往需要给属性赋值额外的限制条件,如年龄在0~100

weixin_43862596的博客 292

什么是封装性?C++ 中如何实现封装?封装性的好处是什么?

封装性是面向对象编程中的一个重要概念,它可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和安全性。封装性是指将数据和操作数据的方法封装在一个类中,对外部隐藏类的内部实现细节,只暴露必要的接口给外部使用。通过封装,我们可以将数据和行为紧密地结合在一起,形成一个独立的单元,使得代码更加清晰、易于理解和维护。例如,我们可以将一个人的信息(如姓名、年龄、性别等)和对这些信息的操作(如设置姓名、获取年龄等)封装在一个Person类中。本文将详细介绍什么是封装性,C++ 中如何实现封装以及封装性的好处。

2301_80313293的博客 589

JAVA中封装性的概念

一、封装性的概念  用到private关键字来时用 1、封装性是面向对象思想的三大特征之一。 2、封装就是隐藏实现细节,仅对外提供访问接口。   封装有: 属性的封装、方法的封装、类的封装、组件的封装、模块化封装、系统级封装… 二、封装的好处 1、模块化 2、信息隐藏 3、代码重用 4、插件化易于调试 5、具有安全性 •class Person{   pri

m_wise的博客 3314
上一篇: 废话少说
下一篇: 痛快
SeaWave
博客等级 码龄27年 117粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值