c++ static

//静态static局部对象只构造一次

#include "stdafx.h"

#include <iostream>

using namespacestd;

 

class A

{

public:

   A()

   {

      cout<<"CONSTRUCTION."<<endl;

   }

};

 

void fn(int i)

{

   static Aa;    //static

   cout<<i<<endl;

}

 

int main()

{

   fn(12);

   fn(14);

   fn(16);

   system("pause");

   return 0;

}

 

 

所谓临时对象,就一种无名对象,它的出现如果不在程序员的预期之下,往往会造成效率上发负担。但有时候刻意制造一些临时对象,却又可以使程序干净清爽。刻意制造临时对象的方法是,在型别名称之后直接加上一对小括号,并可指定初值,例如Shape(3,5),int(8),其意义相当于调用相应的constructor且不指定对象名称。STL最常将此技巧引用于仿函数与算法的搭配上。

 

静态常量数据成员在类内部直接初始化。如果类内含有const static int data member,那么根据C++标准规格,我们可以直接在类内部直接给与赋值所谓int泛指所有整型类别,不单只是int,还可以是long, short, char等。

 

#include <iostream>

using namespacestd;

 

class A

{

public:  

//static const成员也遵循访问控制,若想在类外访问,则必须为public

   const staticint a=3;

   const staticlong intb=45L;

   const staticchar c='C';

};

 

int main()

{

   cout<<A::a<<endl

      <<A::b<<endl

      <<A::c<<endl;

   system("pause");

   return 0;

}

注意:const成员必须在构造函数成员初始化列表中初始化,而static必须在类外初始化。而conststatic int型可以在类内初始化,但是必须也同时在.cpp文件中定义。

 

 

//a.h

#ifndef _A_CLASS_H

#define _A_CLASS_H

 

#include <iostream>

using namespacestd;

 

class A

{

private:

   conststaticint xp=23;

public:

   void display();

};

 

#endif

//a.cpp

#include "a.h"

#include <iostream>

using namespacestd;

 

constint A::xp;

 

void A::display()

{

   cout<<A::xp<<endl;

}

 

//main.cpp

#include "a.h"

#include <iostream>

using namespacestd;

 

int main()

{

   A a;

   a.display();

   system("pause");

   return 0;

}

 

初始化 const 成员和引用类型成员

初始化const成员和引用类型成员的问题,在教材中讲述初始化列表的章节应该都有讲过。

  初始化static const成员,也就是全局的静态常量,这个用到的情况比较多,想必大家都会。通常就是在类的定义中申明staticconst成员,然后在实现文件中赋予初始值,比如:

/* (#) Test.h*/

#pragma once

 

class Test

{

public:

   static constint MASK;//申明int 型的MASK常量

};

 

/* (#)Test.cpp */

#include "Test.h"

 

// 定义Test::MASK常量,注意这里不需要static关键字

const intTest::MASK =0xFFFF;

 

  虽然这种static const的情况使用得最多,但有时候也会想用非static,却是const的情况。staticconst定义的常量是全局的,对该类的每一个实例(对象)甚至在全局范围都有效,而且一致。便有时候需要的常量是针对每一个实例的,每个实例都可能有同类型但不同值的常量,这时候就要用到非static,但是const的申明,如

class Test

{

public:

   const intMY_MASK;

};

 

  这种情况下,要在实例文件中像初始化static const常量一样,对其进行初始化是行不通的。

const int Test::MY_MASK = 0xFF; // 这样会报重定义错误

  况且,就算编译能通过,也不能达到我们要求的“每个对象自己的常量”的要求。

  正确的初始化是通过构造函数的初始化列表来进行,如:

class Test

{

public:

   const intMY_MASK;

   Test() : MY_MASK(0xff) {}

};

如果不是在初始化列表中对const常量进行初始化,而是在构造函数中对其赋值的话,是不成功的。很简单的道理:不能给const成员初始化。同样的道理,如果要初始化一个引用类型的成员变量,也不能在构造函数体内赋值,而只能在构造函数的初始化列表中进行初始化。

示例程序:

#include <iostream>

using namespacestd;

 

class A

{

private:

   int num;

   int &rnum; //引用

   const intcnum; //const

public:

   A(int);

   void display();

};

 

A::A(int n):num(n),rnum(num),cnum(num){}

 

void A::display()

{

   cout<<num<<endl

      <<rnum<<endl

      <<cnum<<endl;

}

 

int main()

{

   A a(3);

   a.display();

   return 0;

}


#include <iostream>
using namespace std;


/* 引用本身不是一个对象,因此不能定义指向引用的指针,但指针是对象,所以存在对指针的引用 */
void func(int *&ptri)
{
*ptri = 123;
}


/* const引用 */
void func2()
{
const int iConst = 123;


/* 错误:一定要用const的引用指向const常亮,否则就意味着iRefConstError可能会修改该值 */
//int &iRefConstError = iConst;


const int &iRefConst = iConst;
cout << "iRefConst == " << iRefConst << endl;
}


/* 一旦定义了引用,就无法令其再绑定到另外的对象,之后每次使用这个引用都是访问它最初绑定的那个对象 */
int main()
{
int i = 23;
int &refi1 = i;

cout << "i == " << i << endl;
cout << "refi1 == " << refi1 << endl;


int &refi2 = i;
cout << "refi2 == " << refi2 << endl;


refi2 = 345;


cout << "i == " << i << endl;
cout << "refi1 == " << refi1 << endl;
cout << "refi2 == " << refi2 << endl;


int iTest = 90;
int *piTest = &iTest;
//func(&iTest); //编译错误,原因未知
func(piTest);
cout << "iTest == " << iTest << endl;


func2();
system("pause");
return 0;
}


/* 成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象,当我们调用一个成员函数时,用请求该函数的对象地址初始化this 
   常量对象,以及常量对象的引用或指针都只能调用常量成员函数。


   只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数


   不接受任何实参的构造函数,称为默认构造函数
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值