printf和wprintf、printf输出结束标识符、c++按值返回临时对象是否是const的实验

2023-05-16

#ifndef _TEST_H
#define _TEST_H
#include <iostream>
#include <string>
using namespace std;

int x = 5;
struct s 
{
public:
	s(const s&)
	{
		a = 1;
		cout << "copy constructor" << endl;
	}
	s()
	{
		a = 0;
		cout << "Initialize" << endl;
	}
	~s()
	{
		cout << "Destructor" << endl;
	}
	void func1(s& test){
		cout << &test;
		test.a = 4;
		//test = s1;
	};
public:
	int a;
};

s makes()
{
	s s1;
	cout << &s1 << endl;
	return s1;
}

string foo()
{
	return "hello";
}
void bar(string&)
{
}

void fa(s &sss)
{
	sss.a = 0;
}

struct   Int 
{ 
	Int(int   i):i_(i){} 
	Int&   operator+(/*const*/ Int&   rhs)     //参数是+号的右值
	{ 
		i_ += rhs.i_;
		return  *this; 
	} 
	int   i_; 
}; 
Int   foo   (int   x,   int   y) 
{ 
	//如果编译器符合标准,那么就不可能通过编译
	//Int(y)返回的是一个临时对象,因为临时对象是不能作为左值的,
	//临时对象不能赋值给非const的引用
	return   Int(x)   +   Int(y); 
} 

class   A 
{ 
public: 
	int   i; 
	A(int   a):i(a){cout << "A(int) " << endl;} 
	A&   operator++() 
	{ 
		i++; 
		return   *this; 
	} 
}; 

void   fun(A&){}

struct M{};
struct B
{
public:
	B(){}
	B(M& a){}
	};
	
struct B1 : public B
{
public:
	B1(/*const*/ B& b) : B(b)
	{}
};


void main()
{
	//这个例子说明在进行类型转换的时候还是会生成const临时变量的,这个
	//是符合c++标准的
	//M a;
	//B1 b1(a);

	//对于这两个例子,网上说是不应该编译通过的,但是在vs2008中编译通过了
	//这说明这个是编译器相关的,vs2008可能做了相关的操作或优化
	//但是c++标准说:如果编译器完全支持c++标准,则这个是通不过编译的
	//fun(A(1));
	//cout << foo(5,6).i_ << endl;
	
	/*
	//考察变量的作用域
	//int x = x;//编译报错,使用时候未初始化
	int x = ::x;
	cout << x << endl;
	//printf("&d",x);
	*/

	//wprintf和printf的区别wchar_t类型
	/*
	wchar_t wch[] = L"helloworld";
	printf("%s\n",wch);
	wprintf(L"%s\n",wch);
	*/

	/*
	//printf和cout是以\0(NULL)标识一个字符串输出结束标识符
	char ch[] = "hello\0world";
	cout << ch << endl;
	printf("%s\n",ch);
	*/
	
	/*
	//这里注意引用和赋值的作用不同,赋值就是拷贝一个副本出来
	int a = 1;
	const int& b =a;  //an convert from int to const int 
	const int aa =2;
	int& bb = aa;     //cannot convert from const int to int
	*/

	/*
	//无论是从书上还是网上查到的,都是说c++如果函数按值返回会产生一个
	//临时对象并且这个对象是const类型的。但是像下面这样来验证的话发现
	//并不是如此,分析后认为:要么这样用到的不是返回的临时对象,但是
	//单步调试之后认为可以排除这种情况;要么是临时对象不是const类型的;
	//要么就是编译器在使用这个临时变量做参数的时候进行了一定的操作(
	//因为如果是显式给一个const类型的参数的话是编译通不过的)。

	//const类型不能被赋为非const类型的值;也不能引用为非const类型的变量。
	bar(foo());
	//bar("hello world");

	//makes();          //生成了临时变量,但是没有想到验证临时对象是否是const类型的方法
	//s s1 = makes();   //编译器优化了,不产生临时变量,编译器相关的
	//makes().a = 3;
	//makes().func1(makes());
	
	fa(makes());
	const s as;
	//fa(as);//编译报错,因为无法将const类型用非const类型来引用
	*/
	//从下面这行代码可以看出,编译器是做了优化的,这个时候应该是
	//要么没有生成临时对象,要么临时对象不是const类型的
	//这样没有生成临时对象
	//s &s2 = makes();
	//cout << &s2 << endl;
	//s s4 = makes();
	//cout << &s4 << endl;
	
	//这样生成了临时对象,但是不是const类型的,应该是编译器相关的结果
	s s3;
	makes() = s3;
	
	printf("\n");
}


#endif //_TEST_H

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

printf和wprintf、printf输出结束标识符、c++按值返回临时对象是否是const的实验 的相关文章

随机推荐

  • 网络编程和并发编程面试题

    网络编程和并发编程面试题 1 简述 OSI 七层协议 一 应用层 与其它计算机进行通讯的一个应用 xff0c 它是对应应用程序的通信服务的 例如 xff0c 一个没有通信功能的字处理程序就不能执行通信的代码 xff0c 从事字处理工作的程序
  • 树莓派利用串口进行通信

    树莓派串口通信 我用的是树莓派3b 43 型号 xff0c 网上各种各样的修改方式来使得树莓派的串口可以工作 xff0c 过于混乱 xff0c 还有的教程甚至会被树莓派系统搞崩溃 xff0c 尤其是树莓派实验室那里的中文教程 xff0c 是
  • Android系统学习(六)------裁剪Android系统

    你好 xff01 这里是风筝的博客 xff0c 欢迎和我一起交流 经过前面几篇博客的编译步骤 xff0c 成功的编出了Android系统 xff0c 但是发现编出来的system img有点大了 xff0c 有差不多1 7G xff0c 怎
  • 用postman批量执行post请求数据

    今天接到一个任务 xff0c 需要在同一个url中执行83次不同的post请求 xff0c 而且需要连续执行3次 xff0c 如果一个一个点击 xff0c 岂不是不符合 xff0c 摸鱼大王的风格 xff0c 思考片刻之后 xff0c 决定
  • 使用python批量发送post请求

    usr bin env python import requests url 61 34 http 192 168 26 xxx 34 header 61 39 Connection 39 39 close 39 39 Accept 39
  • 关于A 全球大气光 atmosphere light 算法总结

    由于大气散色所用引起的光源的特性 随着距离的增大而增强 A其实为无穷远处的一个大气光源 xff0c 比如天空 xff0c 这应该不是指天空中的云而是近地天空 由于各种去雾算法不同对A的依赖可能也不相同 我看到有几种方法对在去雾算法中应用 x
  • 解决树莓派开机黑屏不显示桌面问题

    一 设备状态 xff1a 以前桌面使用正常 xff0c 通过ssh进行安装pyqt5后导致桌面开机黑屏 二 所使用设备为 xff1a 树莓派4B 43 2021 05 07 raspios buster armhf img 三 定位问题 x
  • 树莓派Linux固定多USB设备号相同厂家设备和不同设备(包括一个USB设备两个设备名称号的情况)

    目录 一 问题说明 二 解决思路 三 开干 一 问题说明 在使用USB摄像头时 xff0c 由于使用了两个摄像头 xff0c 故此在上电启动后 xff0c 设备号会发生变化 xff0c 比如设备1之前时video0 xff0c 有的时候上电
  • FreeRTOS学习笔记-流缓冲区(FreeRTOS中文官网)

    https www freertos org zh cn cmn s RTOS stream buffer API html RTOS 流缓冲区 API RTOS 流缓冲区 API 函数 xff1a xStreamBufferCreate
  • FreeRTOS学习笔记-消息缓冲区(FreeRTOS中文官网)

    RTOS消息缓冲区 API RTOS 消息缓冲区 API 函数 xff1a xMessageBufferCreate xMessageBufferCreateStatic xMessageBufferSend xMessageBufferS
  • ubuntu系统X86环境下配置TX2的ARM环境的交叉编译链

    总步骤 安装qtcreator的IDE安装aarch64 linux gnu g 43 43 交叉编译链下载Qt库的源码 xff0c 配置编译选项 xff0c 编译生成针对TX2的ARM环境的qmake工具配置qtcreator xff0c
  • ROS中Eigen库的引用

    在CmakeList txt中添加两个地方 find package Eigen REQUIRED include directories Eigen INCLUDE DIR 如果找不到Eigen xff0c 我们将第一句改成 find p
  • ROS tf使用

    1 静态tf发布 lt node pkg 61 34 tf 34 type 61 34 static transform publisher 34 name 61 34 link1 link2 broadcaster 34 args 61
  • SLAM算法配置——使用Realsense D435i结合ROS跑通ORB-SLAM2的RGB-D节点

    ORB SLAM2源地址 配置环境依赖 Pangolin xff0c OpenCV xff0c Eigen3 xff0c DBoW2 and g2o xff08 源代码里有 xff0c 不用自己装 xff09 xff0c ROS xff08
  • 代码编写及阅读规范

    阅读常识 1 C语言中在函数名或关键字前加下划线 一般情况是标识该函数或关键字是自己内部使用的 xff0c 与提供给外部的接口函数或关键字加以区分 规范 综述 C 43 43 是一门十分复杂并且威力强大的语言 xff0c 使用这门语言的时候
  • 流媒体开发之路

    其实很早之前 xff0c 就想写属于自己的博客 xff0c 大二就有了CSDN账号 xff0c 很讽刺的是 xff0c 工作几年了 xff0c 账号里面的内容竟然和小鲜肉脸一样干净 干净的让人尴尬 回顾自己的这几年的开发之路 xff0c 接
  • matlab图像处理实例详解---note

    1 直方图均衡及直方图规定化 可以优化图像的亮度及gamma效果 2 图像的标准差 当图像越清晰的时候 xff0c 图像的标准差就越大 是否可以用来做af的判定标准 作为fv的值 另外是否可以用图像的相关系数作为caf的一个trigger
  • promise限制并发请求数量

    所谓并发请求 xff0c 就是指在一个时间点多个请求同时执行 当并发的请求超过一定数量时 xff0c 会造成网络堵塞 xff0c 服务器压力大崩溃或者其他高并发问题 xff0c 此时需要限制并发请求的数量 假如等待请求接口1000个 xff
  • 一个跨平台的 C++ 内存泄漏检测器(转载)

    一个跨平台的 C 43 43 内存泄漏检测器 吴咏炜 adah 64 netstd com 2004 年 3 月 内存泄漏对于C C 43 43 程序员来说也可以算作是个永恒的话题了吧 在Windows下 xff0c MFC的一个很有用的功
  • printf和wprintf、printf输出结束标识符、c++按值返回临时对象是否是const的实验

    ifndef TEST H define TEST H include lt iostream gt include lt string gt using namespace std int x 61 5 struct s public s