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

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值