C++中关于static

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中关于static相关的知识,希望对你有一定的参考价值。

代码如下:
—————————————————————————————————————
#include<iostream>
#include<math.h>
using namespace std;

double* matadd(double* a,double* b,int c)

static double* p=new double[c];
static double* head=p;
if(c!=0)

p[0]=a[0]+b[0];
p++;
matadd(a+1,b+1,c-1);

return head;


int main()

double a[5]=1,2,3,4,5;
double b[5]=5,4,3,2,11;
double *p=matadd(a,b,5);

delete []p;
double *p2=matadd(a,b,3); //第二次调用之后就发生错误;

for(int i=0;i<5;i++)

cout<<p2[i]<<endl; //无法输出,输出数字均为无意义数字;

return 0;

—————————————————————————————————————
为什么这个点会出错?能不能讲一讲里面的具体机制(static)?

修改后的代码如下:

#include <iostream>

#include <math.h>

using namespace std;

double *matadd(double* a, double* b, int c)

static double *p = new double[c];    //定义动态数组p

double *head = p;                    //head指针指向p

if(c != 0)

p[0] = a[0] + b[0];

p++;

matadd(a+1, b+1, c-1);

return head;

int main()

double a[5]=1, 2, 3, 4, 5;

double b[5]=5, 4, 3, 2, 11;

double *p = matadd(a, b, 5);

delete []p;

double *p2 = matadd(a, b, 5);

for(int i=0;i<5;i++)

cout<<p2[i]<<endl;

return 0;

运行效果:


static修改的变量为静态变量,它是生命周期起源于程序预编译期间,当所在程序结束后才会消失。而函数内的普通局部变量的生命周期起源于方法被调用,终止于方法调用结束。

static变量无论所处位置在哪,它的生命周期均是大于函数的。

"static double *p"表示将p设置为静态指针,指向动态数组,当嵌套调用matadd()方法时,p依然存在,即多次调用matadd()方法时出现的p指针变量实际上是同一个静态指针变量。

“double *head = p”表示定义普通的指针变量head,它指向p,当matdata()方法被调用时,重新生成指针变量head,但每一次不同的head指针变量均指向同一个p(静态指针变量)。

matdata()函数的作用是将指针a、b指向的数组的第一个元素相加,将相加的和存入p指向的数组中;然后移动a、b、p三个指针,继续重复上一步的操作,赶到a、b指向的数组的元素全部相加为止。最后返回p指向的数组的首地址。

参考技术A developer_05 的回答是错误的,还是越界的
问题主要是递归完成后要把p归位,这样下次才能用,否则下次调用就越界了,还有不能释放空间,释放了就new不出来了
#include<iostream>
#include<math.h>
using namespace std;
double* matadd(double* a, double* b, int c)

static double* p= new double[c]; //这句只能被执行一次
static double* head= p; //同样的这句也只能被执行一次
if (c != 0)

p[0] = a[0] + b[0];
p++;
matadd(a + 1, b + 1, c - 1);

else
p = head; //递归完成后要把p归位
return head;

int main()

double a[5] = 1,2,3,4,5 ;
double b[5] = 5,4,3,2,11 ;
double *p = matadd(a, b, 5);
//delete[]p; //这里不能释放,因为matadd函数里的static double* p= new double[c]只能被执行一次,释放了就不能再new出来了
double *p2 = matadd(a, b, 5);
for (int i = 0; i < 5; i++)

cout << p2[i] << endl;

delete[]p; //放这里
return 0;
参考技术B 我就说下常用情况吧类中全部是静态方法,一般这个类的作用也就类似于思维上的一个命名空间了,一般工具类会使用这种方法,比如数学算法 举例: CMath::translate() CMath::move(x, y), CMath::isEqual(x, y); 使用静态变量做单例,使用静态函数创建和释放单例,这样在逻辑上,这个单例属于一个类,而这个类是一个单例,在程序中仅存一份,也勉强算的上符合“谁创建谁释放”的原则了吧举例: static CInstance CInstance::m_myInstance = NULL; //创建单例 CInstance CInstance::getInstance(someVal)//声明处也是静态 if(m_myInstance == nullptr) m_myInstance = new CInstance(someVal) return m_myInstance; //释放单例 void CInstance::destroyInstance(someVal)//声明静态 if(m_myInstance != nullptr) delete m_myInstance; m_myInstance = nullptr; 3.第三种情况呢,就是在一个类中,需要处理某块逻辑,于是把这块逻辑封成一个函数,但是发现这块逻辑与类中的成员变量毫无关系,而且这块逻辑可能又会在别的类中被调用,也类似于算法或者功能类的东西,就可以把这个函数提成静态函数,供其它类使用。简单回忆了一下,大体就见过这么几种情形吧。 上面代码未进行编译,大体就是表达意思的伪代码,领会即可。

Vue中关于图片路径配置的填坑日记

Vue项目中图片存放位置

vue项目中可以有static和src/assets两个文件夹存放图片。

static中的图片不会被打包,也不会被压缩,一般来说存放的是第三方资源。而且vue-cli3中已经不存在static目录。

虽然都可以放图片,但建议项目资源文件统一存放在assets文件夹中。

 

部署后路径访问错误

本地访问路径:http://localhost:8080,部署到iis中一般需要增加虚拟目录:http://oa.hopenchina.com:8086/yjjshop

这样会导致少一级虚拟目录,找不到路径。

技术图片

此时需要在config/index.js中 把assetsPushlicPath:"/" 修改成"./"

技术图片

这样路径访问就正常了。

 

图片路径设置

部署后,图片可以正常通过相对路径访问

<img src="../assets/img/login/ewm_icon.png"/>

但对于背景图片来说,没有转成base64的背景图都失效了。(小图会自动转换成base64图片,大图不会)

.login-main{  
    width: 100%;
    height: 100vh;
    background: url(../assets/img/login/login_bg.jpg) no-repeat center center;
    background-size: 100% 100%;
}

网上推荐一种写法,使用require引入图片。经过测试可以解决问题,但这种写法非常麻烦,而且只能用在行内元素中。

<div :style="{backgroundImage:‘url(‘+require(‘assets/img/common/bg.png‘)+‘)‘}"></div>

推荐处理方法:

build/unit.js 文件夹 generateLoaders方法中,增加下面配置:publicPath:‘../../‘

技术图片

 这样页面中的相对路径都不需要处理即可运行正常。

 

引申小技巧:

如果觉得相对路径的写法太麻烦,可以用~@/assets的方式代替。

.login-main{  
    width: 100%;
    height: 100vh;
    background: url(~@/assets/img/login/login_bg.jpg) no-repeat center center;
    background-size: 100% 100%;
}

~表示后面的值为 alias, 然后就会去 build/webpack.base.conf.js 的 alias 配置中找相应的值,

技术图片

 @配置的地址是src。

~@/asset代表的就是src/asset

以上是关于C++中关于static的主要内容,如果未能解决你的问题,请参考以下文章

css中关于position属性的探究(原创)

《深度探索C++对象模型》第1章重点:关于对象

关于C++中的类型转换

Vue中关于图片路径配置的填坑日记

Vue中关于图片路径配置的填坑日记

C++中关于属性向量的查询