C++赋值运算符重载为何不能重载为友元函数,为何不能被继承

量化金融笔记1-股票量化基础 股票量化基础 文章目录什么是股票股票的定义及其诞生所解决的问题股票的主体和流通股票的常规分类股票价格收益率什么是股票价格的收益率股票价格收益率计算在python中的实现两种收益率算法的特点及应用场合股票交易规则场内交易与场外交易A股、B股、H股国内多层次的资本市场股票交易指令和撮合机制股票交易时间股票交易成本股票复权股票数据介绍与提取行业分类和指数行情数据因子数据标的数据基本面数据 什么是股票 股票的定义及其诞生所解决的问题 股票的定义:股票是一种有价证券,是股份有限公司公开发行的用以证明投资者的股东身份 阅读详情

C++赋值运算符重载为何不能重载为友元函数,为何不能被继承

为何不能重载为友元函数

因为在调用赋值运算符重载的时候有歧义,存在二义性;看代码

#include <iostream>
using namespace std;
class A
{
private:
    int x;
public:
    A() { x = 1; }
    A(int xx)
    {
        cout << "Call A(int xx)" << endl;
        x = xx;
    }
    friend A operator=(int xx)   //重载赋值运算符运算
    {
        cout << "Call A operator=(int xx)" << endl;
        x = xx;
        return *this;
    }
};

int main()
{
    A a;
    a = 9;
    return 0;
}

当直行到 a=9 的时候,编译器是调用友元函数 friend A operator=(int xx) 呢,还是调用构造函数A(int xx)呢,那用户的真实本意到底是调用哪个呢,不确定,为了防止歧义,禁止赋值运算符重载为友元函数。

更详细的解释

1、因为它认为类中并没有重载赋值运算符的成员函数,所以它根据C++的规则,会去调用相应的构造函数。

2、但是在全局里,我们已经重载了参数类型为此类类型的赋值运算符函数,而这赋值语句刚好和这函数匹配上了,根据C++的规则,也会去调用这函数。

综合以上两条,到底调用哪一个,会存在二义性。

为何不能被继承

class A1
{
public:
int operator=(int a)
{
return 8;
}

    int operator+(int a)
    {
            return 9;
    }

};

class B1 : public A1
{
public:
int operator-(int a)
{
return 7;
}
};

int main()
{
B1 v;
cout << (v + 2) << endl; // OK, print 9
cout << (v - 2) << endl; // OK, print 7
cout << (v = 2) << endl; // Error, see below

    return 0;

}

VC编译器的错误提示:

error C2679: binary ‘=’ : no operator defined which takes a right-hand operand of type ‘const int’ (or there is no acceptable conversion)

意思是说编译器找不到int operator=(int a)这个成员函数可以调用。

真是怪了?明明int operator=(int a)这个函数是我从基类公有继承下来的函数,怎么编译器识别不了呢?遇到这种问题,第一反应就是查找MSDN以求得解释,微软告诉我:

“All overloaded operators except assignment (operator=) are inherited by derived classes.”

意思是说:除了赋值运算符重载函数以外,所有的运算符重载函数都可以被派生类继承。

我这个函数int operator=(int a)很不幸就是微软所说的“赋值运算符重载函数”,当然不能被继承!

可是到此为止,我心中的疑问依然没有消除。为什么“赋值运算符重载函数”不能被派生类继承呢?从C++语义上讲,不允许这个函数被派生类继承并没有充足的理由,一个类对象实例完全可以被任何一个其他类对象实例所赋值!比如一个颜色对象实例可以被一个整数赋值,甚至可以被一个小白兔实例所赋值。赋值运算符既然允许重载,就应该允许被继承,就像其他的运算符重载之后都可以被派生类继承一样。微软的解释并没有说明为什么“赋值运算符重载函数”不能被继承的幕后原因。

我又查找了C++ Primer和其他一些重量级的C++经典,可是这些书籍对此问题都避而不谈,抑或是语焉不详,我都没有找到答案。于是,我只好反身求诸己,从C++类对象的构造开始分析,结果找到了我认为是正确的答案:

1,每一个类对象实例在创建的时候,如果用户没有定义“赋值运算符重载函数”,那么,编译器会自动生成一个隐含和默认的“赋值运算符重载函数”。所以,B1的实际上的声明应该类似于下面这种情况:

class A1
{
public:
int operator=(int a)
{
return 8;
}

    int operator+(int a)
    {
            return 9;
    }

};

class B1 : public A1
{
public:
B1& operator =(const B1& robj); // 注意这一行是编译器添加的
int operator-(int a)
{
return 7;
}
};

2,C++标准规定:如果派生类中声明的成员与基类的成员同名,那么,基类的成员会被覆盖,哪怕基类的成员与派生类的成员的数据类型和参数个数都完全不同。显然,B1中的赋值运算符函数名operator =和基类A1中的operator =同名,所以,A1中的赋值运算符函数int operator=(int a);被B1中的隐含的赋值运算符函数B1& operator =(const B1& robj);所覆盖。 A1中的int operator=(int a);函数无法被B1对象访问。

3,程序中语句v = 2实际上相当于v.operator =(2);,但是A1中的int operator=(int a);已经被覆盖,无法访问。而B1中默认的B1& operator =(const B1& robj);函数又与参数2的整数类型不相符,无法调用。

4,为了确认B1中默认的B1& operator =(const B1& robj);函数的存在性,可以用以下代码验证:

B1 b;
B1 v;

v = b; // OK, 相当于调用v.operator =(b);

5,所以,“赋值运算符重载函数”不是不能被派生类继承,而是被派生类的默认“赋值运算符重载函数”给覆盖了。

这就是C++赋值运算符重载函数不能被派生类继承的真实原因!

关于本帖问题正确性的解释

C++程序员的必读经典《Effective C++》这么说:

条款45: 弄清C++在幕后为你所写、所调用的函数

一个空类什么时候不是空类? ---- 当C++编译器通过它的时候。如果你没有声明下列函数,体贴的编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:

class Empty{};

和你这么写是一样的:

class Empty {
public:
Empty(); // 缺省构造函数
Empty(const Empty& rhs); // 拷贝构造函数

~Empty(); // 析构函数 ---- 是否
// 为虚函数看下文说明
Empty&
operator=(const Empty& rhs); // 赋值运算符

Empty* operator&(); // 取址运算符
const Empty* operator&() const;
};

但是Effective C++依然不能作为最后的判决。让我们从C++的“宪法”中寻找答案…

ISO/IEC 14882是C++的国际标准。该标准于1998年9月1日通过并且定案。当然,这个标准已经不是最新标准了,但这个标准却是目前最被广泛支持的C++标准。所以,我一向称之为C++的“宪法”。

C++“宪法”第12章 Special Member Functions (第185页)开宗明义:

The default constructor, copy constructor and copy assignment operator, and destructor are special member functions. The implementation will implicitly declare these member functions for a class type when the program does not explicitly declare them, except as noted in 12.1. The implementation will implicitly define then if they are used, as specified in 12.1, 12.4 and 12.8. Programs shall not define implicitly-declared special member functions. Programs may explicitly refer to implicitly declared special member functions.

译文:
缺省构造函数,拷贝构造函数,拷贝赋值函数,以及析构函数这四种成员函数被称作特殊的成员函数。如果用户程序没有显式地声明这些特殊的成员函数,那么编译器实现将隐式地声明它们。12.1中有特别解释的例外。如果用户程序调用了这些特殊的成员函数,那么编译器就会定义这些特殊的成员函数,在12.1,12.4,12.8中分别规定了编译器对这些函数的定义方式。用户程序不能定义隐式声明的特殊成员函数。用户程序可以显式地调用隐式声明的特殊成员函数。

译注:
根据C++标准的规定:

声明(Declare)代表头文件中的那部分代码,比如下面就是一个声明:

class A
{
public:
A();
}

定义(Define)代表源文件中的代码,比如下面就是一个定义:

A::A()
{}

参考:
http://blog.chinaunix.net/uid-27250618-id-5700614.html
https://blog.youkuaiyun.com/qq_34681261/article/details/72616289

[EdgeAI] NXP eIQ 机器学习Toolkit (一):准备篇 eIQ™机器学习(ML)软件开发环境支持在恩智浦EdgeVerse™微控制器和微处理器(包括i.MX RT跨界MCU和i.MX系列应用处理器)上使用ML算法。eIQ ML软件包括称为eIQ Toolkit的ML工作流工具以及推理引擎、神经网络编译器和优化库。............ 阅读详情

相关推荐

Blazor Session设置

微软官方封装了一些浏览器的操作,其中就有Session的操作的封装ProtectedSessionStorage 微软文档因为我们知道,依赖注入的生命周期是Singleton程序Scoped网页:刷新,url直接跳转都会重置。Transient路由C# Blazor 学习笔记(10):依赖注入但是没有一个和浏览器绑定的生命周期。即浏览器关闭才会退出。这个是后端无法获取的,因为后端根本不知道浏览器何时关闭。这个只能用浏览器自带的缓存。

qq_44695769的博客 1786

有些运行符不能重载为友元函数,它们是:=,(),[]和->。

原因:有人说是因为 C++规定赋值运算符“=”只能重载为类的非静态成员函数,而不可以重载为类的友元函数。 不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的,不是属于某个对象的,它只能去操作类静态数据成员。而赋值运算符“=”是基于对象操作的。 当把赋值运算符重载为类的友员函数,在程序中执行类对象的赋值语句时,程序就会出现两种矛盾的选择。 (1)因为它认为

imxiangzi的专栏 4416

Mit6.S081-实验1-Xv6 and Unix utilities

Mit6.S081-实验1-Xv6 and Unix utilities前言一、Boot xv61,实验目的2,操作流程1)切换到xv6-labs-2020代码库的lab1分支2)启动xv63)测试xv64)过程分析5)其他操作二、在xv6中添加一个自己编写的程序1,源码准备2,编译配置3,测试添加程序4,过程分析三、xv6中shell简析 前言 一、Boot xv6 1,实验目的 利用qemu启动xv6 2,操作流程 1)切换到xv6-labs-2020代码库的lab1分支 git checkout ut

code a better life~ 36万+

C++ 赋值运算符能重载为类外非成员函数吗?

  下列是重载为非成员函数的运算符函数原型,其中错误的是( )。  A.Fraction operator +(Fraction, Fraction);  B.Fraction operator -(Fraction);  C.Fraction&amp; operator =(Fraction&amp;, Fraction);  D.Fraction&amp; operator +=(Fracti...

Spr Chan的博客 3578

抖音直播参数逆向实战:手把手教你用Python获取ttwid和x-bogus(附完整代码)

本文深入解析抖音直播接口的反爬机制,重点剖析核心防护参数ttwid和x-bogus的生成原理与作用。通过Python实战,手把手教你逆向获取ttwid、webid等关键参数,并构建稳定的数据采集方案,为开发者提供企业级数据获取能力。

weixin_29196891的博客 1043

PT静态时序分析实战:从基础命令到高级报告解析

本文详细介绍了PT(PrimeTime)静态时序分析(STA)的实战技巧,从基础命令如pt_shell和report_timing的使用,到高级报告解析与问题排查。通过丰富的实例和脚本示例,帮助工程师快速掌握时序分析的核心技能,提升芯片设计验证效率。

weixin_29289821的博客 954

7.c++基础知识_运算符重载_类外函数

operat+

AIoT技术栈的博客 300

GLM-4本地部署的实战教程

本文主要介绍了GLM-4-9B本地部署的实战教程,希望对学习和使用大模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 下载模型文件 3. 运行glm-4-9b-chat

herosunly的博客 25万+

C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)理解。

以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下   C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么呢? 现在先说说赋值运算符“=”的重载 C++规定赋值运算符“=”只能重载为类的非静态成员函数,而不可以重载为类的友元函数。 不能重载为类的静态成员应该比较容易理解,因为静态成

u014610226的专栏 4141

基于MATLAB的多无人机多任务调度算法——CBBA带时间窗

本文将介绍基于MATLAB的CBBA算法,并对其进行改进,加入时间窗概念,以提高多无人机系统的调度效率和性能。时间窗用于限定任务的执行时间范围,以避免任务执行时间过长或过短导致的问题。具体而言,我们为每个任务设置一个允许的最早开始时间和最晚结束时间,并在任务分配的过程中考虑这些时间约束。在多无人机系统中,需要将若干个任务分配给不同的无人机完成,以实现高效的任务执行。以上是关于基于MATLAB的多无人机多任务调度算法CBBA带时间窗的简要介绍和源代码实现。多无人机系统的调度问题。

BUG?不存在的! 1897

一步步教你使用 NVIDIA 推出的全新GPU加速求解器 cuOpt:解锁超高效率的求解体验

未完成

Linshaodan520的博客 868

C++之运算符重载问题

运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该重载的运算符时调用此函数。在类定义中如果没有显式给出赋值运算符重载函数时,并不是不用赋值函数,而是由系统自动调用缺省的赋值函数。运算符的左操作数一定是对象,因为重载的运算符是该对象的成员函数,而右操作数是该函数的参数。1、运算符重载函数的函数名必须为关键字operator加一个合法的运算符。2、当用类的成员函数实现运算符的重载时,运算符重载函数的参数(当为双目运算符时)为一个。还有 # , ## , // , / * */

yuanshengti的博客 442

qcc304x笔记之手机端显示电量(九)

默认的sdk有些安卓手机不支持电量显示,所以需要加电量显示的补丁 流程分析 1. 首先新建一个task,并将task注册给电池模块 appBatteryRegister(batteryRegistrationForm) 实现handler处理函数,当battery模块电池电量更新后,会将电池百分比值发送到本模块,然后我们就可以在handler中将实时电量同步到手机端了。 hfpAtCmdInit atCmdTask.task.handler = appAtCmdHandleM...

在云巅的博客 2199

c++语言基础:那些成员函数不能被继承,什么函数不能证明为虚函数

c++语言基础知识

qq_51046087的博客 1393

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深度学习工具包 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")

运算符重载规则

运算符重载规则       运算符重载函数也是函数,重载的运算符不会改变运算符的优先级、结合型和参数的个数。      重载运算符不能违反语言的语法规则。      赋值运算符除外,重载运算符可由派生类继承下去。      重载运算符不能使用默认参数。      运算符=、()、[]和->等操作符必须定义为类的成员函数,将这些操作符定义为友元函数将在编译时标记为错误。      输入运算

T_W_S的专栏 785

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++常用知识点(一)

①常对象只能调用常成员函数和常成员变量 ②常成员函数的const放在最后,且不能修改成员变量,只能调用常成员函数。 ③常成员变量和子对象初始化必须用初始化列表 ④静态常成员变量和静态成员变量一样在类外初始化,不能调用非静态成员和函数,如果要调用需要加上类实例对象。 ⑤可以通过构造函数的参数将数据转换为类类型 ⑥函数重载参数有int为后缀++,否则为前缀++ 全局友元函数在类中声明 ⑦=,(),[]...

one-way or another 225

ssm框架搭建

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

C++ 重载运算符 继承 多态 (超详细)

(一)重载运算符: (1)声明与定义格式 一般是类内声明,类外定义,虽然可以在类内定义,但 写前面堆一堆不好看!!! 类内声明: class Demo { 返回值类型 operator 运算符(形参表); } 类外定义: 返回类型 Demo(类名)::operator运算符(形参表) { 函数体 } (2)双目运算符重载为成员函数 当重载运算符为双目运算符时,形参表中只有一个参数...

日拱一卒,功不唐捐 4759

特殊运算符重载及注意点、继承、组合、修饰权限、菱形继承

特殊运算符重载及注意点特殊运算符重载及注意点一、赋值运算符 = 重载将⼀个对象赋值给另⼀个对象的时候**,会调⽤赋值运算符重载函数 **注意:如果没有⼿动添加它,编译器会提供⼀个默认的赋值运算符重载函数C++ 强制规定,赋值运算符重载函数只能定义为类的成员函数二、左移运算符<<重载三、不能被重载的运算符⼤部分运算符都可以重载,以下运算符不能重载四、注意点C++ 中⼤部分运算符都可以重载,只有⼀⼩部分不可以重载,其中 "=“和”&" 不重载,编译器默认⽀持。

interese的博客 896

从0开始C++(五):友元函数&运算符重载

C++中的友元函数是一种特殊的函数,它可以访问和操作类的私有成员和保护成员。友元函数可以在类的内部或外部声明和定义,但在其声明和定义中需要使用关键字friend来标识。友元函数可以是全局函数,也可以是其他类的成员函数。下面是友元函数的一些重要特点和用法:友元函数可以访问和操作类的私有成员和保护成员,这使得函数可以直接访问类的私有数据,而无需通过类的公有接口进行访问。友元函数可以在类的内部或外部声明和定义。在类的内部声明友元函数时,使用friend关键字来标识函数为友元函数。

当实力撑不起野心的时候 学习才是唯一出路 1450

【C++】重载赋值运算符

重载赋值运算符(解决指针悬挂) —— (与拷贝构造函数结合起来理解) c++中,对于任何一个类,如果没有用户自定义的赋值运算符函数,系统会自动的为其生成一个默认的赋值运算符函数,以完成数据成员之间的逐位复制。通常情况下,默认的赋值运算符函数可以完成赋值任务,但在类中含有指针的特殊情况下,就不能直接互相赋值,因为有可能造成指针悬挂。 指针悬挂问题 解决方法:重载赋值运算符解决指针悬挂问题 引出一个...

菜鸟变大鸟的博客 968

Day4 C++(运算符重载,模板与容器)(友元函数,运算符重载,赋值运算符,string字符串类,模板)

1。

weixin_64032452的博客 1363

c++ 友元函数 / 继承和派生

重载运算符 //重载+运算符 const Integer operator+(const Integer & other) const; const Integer operator-(const Integer & other) const; const Integer operator*(const Integer & other) const; const Integer operator/(const Integer & other) const; const Int

weixin_44121207的博客 989

【CPP】继承语法详解与菱形继承

CPP继承语法,重点讲解了多继承中的菱形继承问题!

BinaryWiker的博客 878

赋值运算符重载函数(operator=)引发的问题

目录 背景: 正文: 1、举例 2、参数解析: 3、返回值 4、调用时机 5、提供默认赋值运算符重载函数的时机 6、构造函数还是赋值运算符重载函数 7、显式提供赋值运算符重载函数的时机 8、浅拷贝和深拷贝 9、赋值运算符重载函数只能是类的非静态的成员函数 10、赋值运算符重载函数...

Lawrence_121 2169

深入解析C++核心特性:运算符重载、继承、多态与抽象类

本文全面解析C++运算符重载、继承、多态与抽象类的核心机制,涵盖赋值运算符深拷贝逻辑、多重继承的二义性解决方案、虚函数动态绑定原理及纯虚函数的接口设计模式,通过典型代码示例展示面向对象编程的代码复用、扩展性与多态优势,为开发者提供实践指导。

云云我啊,最喜欢用博客了呢 1201

【C++】继承 上篇

文章目录1、概念及定义1.1 概念1.2 定义2、class 与 struct 的区别3、赋值兼容规则4、继承中的作用域问题5、派生类(子类)的默认成员函数5.1 构造函数5.2 拷贝构造函数5.3 赋值运算符重载5.4 析构函数6、基类中哪些成员被子类继承了?6.1 成员变量6.2 成员方法 1、概念及定义 1.1 概念 继承主要的工作就是-----共性抽取 具体地讲:   ①继承机制是面向对象程序设计使代码可以复用的最重要的手段;   ②允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样实现的类

Suk_god的博客 1806
上一篇: QT模态对话框和非模态对话框
下一篇: STL traits
越甲八千
博客等级 码龄11年 2953粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值