静态成员函数和非静态成员函数的区别

C++中静态成员函数访问非静态成员变量 先看一个classclass a...{public:  static FunctionA()  ...{     menber = 1;  }private:  int menber;}编译上述代码,出错。原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变 阅读详情

静态成员函数和非成员函数的区别

从知乎上看到一个问题,看得我怀疑人生,咬牙切齿,如下图:
在这里插入图片描述

对于面试官的解释,把我整蒙圈了;于是自己写代码验证如下:

#include<iostream>
using namespace std;

class A
{
public:
	static int func1()
	{
		cout << "11" << endl;
		return 0;
	}
	void func2()
	{
		cout << "MM" << endl;
	}
};
int main(void)
{
	A s;
	s.func1();
	s.func2();

	A m;
	m.func1();
	m.func2();
}
转到汇编:
001C1C73  xor         eax,ebp  
001C1C75  mov         dword ptr [ebp-4],eax  
	A s;
	s.func1();
001C1C78  call        A::func1 (01C13EDh)  
	s.func2();
001C1C7D  lea         ecx,[s]  
001C1C80  call        A::func2 (01C13E8h)  

	A m;
	m.func1();
001C1C85  call        A::func1 (01C13EDh)  
	m.func2();
001C1C8A  lea         ecx,[m]  
001C1C8D  call        A::func2 (01C13E8h)  
}
001C1C92  xor         eax,eax  
001C1C94  push        edx  

可以看到,类A实例化两个临时对象s和m,s和m在调用静态成员函数时都是执行 call A::func1 (01C13EDh) ;调用非静态成员函数是都是 call A::func2 (01C13E8h) ;没有拷贝呀;
那面试官回答:静态成员函数只有一份拷贝,而普通成员函数在每个类对象中都有一份拷贝。我认为就是胡扯;

我认为:静态成员函数和非静态成员函数最本质的区别在于,静态成员函数属于类,非静态成员函数属于类对象,静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。

对于面试官的话,我不敢苟同,若哪位前辈有高见,欢迎赐教指点;

c++自学笔记 核心编程篇(二) 因为非静态成员变量的数据属于特定的一个对象,在静态成员函数中,若要访问,无法区分到底属于哪一个对象,因此静态成员函数不能访问非静态成员变量。c++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置(每个空对象也应该有一个独一无二的内存地址)。this指针指向被调用的成员函数所属的对象。通过4.3.1知道,在c++中类内的成员变量和成员函数是分开存储的。而静态成员变量的数据是所有对象共用的,所以可以被静态成员函数访问。c++类中的成员可以是另一个类的对象,我们称该成员为对象成员。 阅读详情

相关推荐

复习笔记(三)——C++类和对象

目录类和对象在内存中的关系 类和对象在内存中的关系

别呀的博客 1138

类中的静态成员变量和静态成员函数

static修饰的成员 你想要的,岁月凭什么给你,所有逆袭,都是有备而来,所有光芒,需要时间才能被看到,所有幸运,都是努力埋下的伏笔。所以,你不努力谁也给不了你想要的生活。 成员:成员变量 成员函数 static 修饰成员变量 修饰成员函数 static声明为静态的,称为静态成员。 不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。 静...

兰天禄的博客 1805

保姆级教程:在Ubuntu 20.04上搞定PX4飞控与T265的视觉定位(附避坑指南)

本文提供在Ubuntu 20.04上配置PX4飞控与T265视觉定位系统的详细教程,涵盖驱动安装、ROS与MAVROS桥接、PX4参数调优及故障排查。通过实测验证的步骤和避坑指南,帮助开发者实现厘米级精度的视觉定位,特别适合室内无人机应用。

weixin_29038155的博客 248

静态函数和非静态函数的区别(静态方法和非静态方法)

首先,静态函数只有当程序结束的时候才从内存消失,生命周期长。而非静态则是动态加载到内存,不需要的时候就从内存消失。 而调用类中的静态函数,无需创建对象就可以调用了,因为当类初始化的时候,就已经加载了静态函数,所以静态函数要比对象加载的早,对象只有被创建的时候才会在堆内存中创建空间。   另外,静态函数中不能使用非静态变量,静态方法不可以定义this,super关键字(因为静态比对象先加载,而t

ghjzzhg的博客 6400

【SLAM】SVO2.0编译运行和论文代码解读

SVO2是我遇到的最难编译的代码了,可能公开版本不能放太鲁棒的代码吧,搞了快一个星期,终于跑起来了。

iwanderu的博客 5973

跟着团子学SAP CO:基于成本的完工百分比结算:Cost-based POC(以项目为例)

本文以英国及北美会计准则下的基于成本的POC的销售型项目结算对PS模块中的完工百分比进行介绍

Lucas1211的博客 2万+

C++ 静态成员函数和非静态成员函数的区别

数据成员: 静态数据成员是类的一部分,为类的所有实例共享(静态区);非静态数据成员,类的每个实例都有一份拷贝(动态区)。 静态数据成员的访问: 静态数据成员是类的一部分,在产生任何实例之前已经存在。 函数成员(都在代码区): 静态函数成员与非静态函数成员都为类所有,对象中并不存在函数的拷贝(每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,但是在逻辑上函数和数据是一起被封装进...

Shrimp_millet 1万+

FreeRtos——10、全局看门狗设计

RTOS 里的看门狗不只是为了证明 CPU 还在动,而是为了证明每个业务逻辑都在按预期的节奏“呼吸”。

qq_40170041的博客 900

静态成员函数和非静态成员函数的区别?

静态成员函数和非静态成员函数的区别? 一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。 例如: 1 class Sc 2 { 3 public: 4 void nsfn(int a); //像声明Sc::nsfn(Sc *this , in

liushuiwen101423的专栏 472

CVAEGAN实现锂离子电池EIS数据增强:基于健康状态的阻抗谱生成

本文提出了一种基于CVAEGAN的锂离子电池EIS数据增强方法。该方法结合了变分自编码器和生成对抗网络的优点,能够根据指定的健康状态(SoH)生成高质量的EIS阻抗谱数据。文章详细介绍了数据预处理流程、模型架构设计(包括编码器、解码器和判别器),并提供了完整的PyTorch实现代码。通过条件生成的方式,该方法可以有效解决电池健康评估中标注数据不足的问题,为基于数据驱动的电池诊断提供更丰富的训练样本。实验结果表明,生成的EIS数据具有良好的真实性和多样性,可用于增强电池健康状态评估模型的性能。

huanghm88的专栏 497

Android 13.0 SystemUI下拉状态栏背景增加高斯模糊背景

在13.0的产品开发中,发现现在很多产品都是高斯模糊背景的,这种高斯模糊背景看起来效果很不错,产品开发需要SystemUI下拉状态栏背景也是高斯模糊背景,所以就要来实现下拉状态栏高斯模糊背景

安卓兼职framework和app工程师的博客 2670

C++中关于指向非静态成员函数和静态成员函数的指针的用法区别

int (Point::*funcptr)() const = &Point::getX; // 定义成员函数指针并初始化 void (*funcptr)() = Point::showCount; // 定义一个指向函数的指针,指向类的静态成员函数 在书上的例子中,有以上两条语句。可以发现,指向成员函数的指针,当指向普通成员函数时,需要使用&;指向静态成员函数时,不需...

一介码农 1707

与OpenClaw同类性质的AI智能体框架/工具汇总(小白友好)

OpenClaw的核心定位是「开源、本地优先、可执行真实任务的AI代理」,核心价值是让AI从“聊天”落地到“动手干活”(操控电脑/服务器、处理办公/系统任务)。结合这一核心,以下是同类性质的工具/框架,按「小白易上手程度」排序,每个产品重点说明和OpenClaw的异同、核心优势及适配场景,方便小白快速区分选择。

hy行者勇哥的博客 2107

c++-静态成员函数和非静态成员函数的区别

1.virtual与静态函数 C++中,静态成员函数不能被声明为virtual函数。 例如,下面的程序会编译失败。#include<iostream> class Test { public: // 编译错误:static成员函数不能声明为virtual virtual static void fun() { } }; 同样地,静态

扎扎实实写代码的专栏 8905

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 384

深度学习工具包 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++ 静态成员函数和非静态成员函数的区别?

说明:一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。 例子: class Sc { public: void nsfn(int a); //像声明Sc::nsfn(Sc *this , int a); static void sfn(i

u011099079的博客 701

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++中静态成员函数和非静态成员函数的区别

它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。 例如: 1 class Sc 2 { 3 public: 4 void nsfn(int a); //像声明Sc::nsfn(Sc *this , int a); 5 static void sfn(int a); // 无this指针 6 /

B10090411的博客 1228

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

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

静态和非静态成员,函数之间到底区别在哪里了?

想问一下:静态和非静态成员,函数之间到底区别在哪里了? 到底静态和非静态之间有什么根本的区别了?设置这个非静态和静态的目的是什么了? ------解决方案-------------------------------------------------------- 静态变量应该是具有全局生命期和局部作用域的东东吧 ------解决方案------------------------

l416799300的专栏 532

【C&C++】C++类成员函数取地址以及类非静态成员函数和静态成员函数的区别

前言 相对于C语言,C++在类的设计中存在两点特殊设计: 成员函数重载 非static的成员函数,编译器在编译该成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this. 而本文中,与第二点特性相关. 在类中,static不仅可以进行静态成员变量的声明,还可以进行静态成员函数的声明。普通成员函数可以访问所以成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。 普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不

love131452098的博客 2425

全局变量和局部变量的区别/静态成员函数变量和非静态函数变量的区别

一、全局变量和局部变量的区别 (1)、生命周期 (2)、存储区不同。前者在全局数据区,后者在堆栈区; (3)、作用域 (4)初始化时,全局变量被初始化为0,后者是随机数; 二、静态成员(函数、变量)和非静态函数(变量)的区别 (1)共享性:静态成员是类的一部分,被类的所有的对象实例所共享;非静态数据成员,类的每个实例都有一份拷贝。 (2)内存分配:静态成员是类的静态成员(数据成员和函

gaosaixing的博客 520

C++静态成员和非静态成员的区别和使用

C++静态成员和非静态成员的区别和使用   对象与对象之间的成员变量是相互独立的。要想共用数据,则需要使用静态成员和静态方法。   只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变量。(因为静态成员变量在对象创建之前就已经被分配了内存空间)   静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象...

weixin_30625691的博客 135
上一篇: C++类对象的大小(1)
下一篇: C++类默认函数
越甲八千
博客等级 码龄11年 2956粉丝 553原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值