isEqualTo函数模板久久不能通过,到底是小媛掉发过少,还是发量太多,种种谜团围绕在本题周围。让我们跟随Jine一起探索谜团背后的悬疑。

原题目如下:

请为判断函数isEqualTo编写一个简单的函数模板,isEqualTo函数利用等号运算符(==)判断两个同类型的参数是否相等,如果相等则返回true;反之返回false。在主函数中,利用函数模板,对多种内置数据类型(int/char/double)调用isEqualTo函数。
接着,定义Someclass类,该类具有两个数据成员。请为该类添加必要的成员函数,使得在主函数中能够调用isEqualTo函数判断两个对象是否相等。

测试用例如下:

Sample Input:
3 5
d t
3.5 7.8
2 5.6
Sample Output:
3 and 5 are not equal
d and t are not equal
3.5 and 7.8 are not equal
The class objects (1,1.1) and (2,5.6) are not equal
Sample Input:
2 4
d D
1.2 1.2
1 1.1
Sample Output:
2 and 4 are not equal
d and D are not equal
1.2 and 1.2 are equal
The class objects (1,1.1) and (1,1.1) are equal

然后开始写吧,在认真掉发 思考后写出的源代码:

#include<iostream>
using namespace std;

template<typename T>
bool isEqualTo(T& x,T& y)
{
	if(x==y) return true;
	else  return false;
}
//函数模板
class SomeClass
{
public:
	int x;
	double y;
	SomeClass(int xx=0,double yy=0){x=xx;y=yy;}
	
	bool operator==(SomeClass& z);
	friend istream& operator>>(istream &in ,const SomeClass &z);
	friend ostream& operator<<(ostream &out ,const SomeClass &m);

};
istream& operator>>(istream &in ,const SomeClass &z){
	in>>z.x>>z.y;
	return in;
}
ostream& operator<<(ostream &out ,const SomeClass &m){
	out<<"("<<m.x<<","<<m.y<<")";
}

bool SomeClass:: operator==(SomeClass& z)
{
	if(z.x==x&&z.y==y) return 1;
	else return 0;
}

int main()
{
    int a;   // integers used for
    int b;   // testing equality
    
    // test if two ints input by user are equal
//    cout << "Enter two integer values: ";
    cin >> a >> b;
    
    char c;  // chars used for
    char d;  // testing equality
    
    // test if two chars input by user are equal
//    cout << "\nEnter two character values: ";
    cin >> c >> d;
    
    double e;   // double values used for
    double f;   // testing equality
    
    // test if two doubles input by user are equal
//    cout << "\nEnter two double values: ";
    cin >> e >> f;
    
    SomeClass g( 1, 1.1 );  // SomeClass objects used
    SomeClass h;  // for testing equality
    
    cin >> h;
    
    cout << a << " and " << b << " are "
    << ( isEqualTo( a, b ) ? "equal" : "not equal" ) << '\n';
   
    cout << c << " and " << d << " are "
    << ( isEqualTo( c, d ) ? "equal" : "not equal" ) << '\n';
    
    
    cout << e << " and " << f << " are "
    << ( isEqualTo( e, f ) ? "equal" : "not equal") << '\n';
    
    // test if two SomeClass objects are equal
    // uses overloaded << operator
    cout << "The class objects " << g << " and " << h << " are "
    << ( isEqualTo( g, h ) ? "equal" : "not equal" ) << '\n';
    
    return 0;
    
} // end main

看上去已经大功告成,写完后,小媛喝了口茶,她知道,事情没有那么简单。于是,在本地编译通过后,运行时在输入三组数之后总会自动结束。
新一轮的掉发头脑风暴后(实际是改了一两个小时无果,就随便试试)终于发现:
如果重载流运算符>>时将去掉const,就可以输入第四组数,并完成isEqualTo函数模板功能。

**~~~~~~~~~~~~~~**
分隔符:好啦,小媛准备明天的c++期末考试去了,考完试会再来讲述她的奇(diao)妙(fa)之旅

2020/06/19更新~~~~我来了~
前天考完c++,又摸了一天的鱼,终于要放暑(xue)假(xi)了,不过在此之前还是要写完这道题:
首先来回顾一下整道题的详细思路:
根据题意,首先利用函数模板写出isEqualTo函数,因为后面要利用它判断真假,因此定义为一个bool类型,在SomeClass类中有数据成员,构造函数,==操作符重载,输入输出流重载。 其中 ==操作符重载是因为函数模板中对SomeClass类型的相等判定需要我们自己定义,返回值依旧是bool类型的。
问题来了,在对流输入运算符<<运算符重载参数你用的是一个SomeClass类型的参数,为了安全起见,你加了const,使其变为只读。可是下面你要给类的数据成员赋值,和const的只读性矛盾,可是编译器却不会报错,只有在你运行时才能发现错误,如果代码量比较大,你又不容易debug,所以这种错误还是比较浪费时间的。

**总结:

一个很小却比较有用的知识点:我们老师讲过一句话:“当const可加可不加时,最好加上”,没错,加const的确有利于数据的安全性,可是在重载流输入运算符时,由于接受的参数是需要修改的,因此参数不能加const的。
最后可以参考这篇文章,对运算符重载中的const有比较详细的分析:

https://blog.csdn.net/weixin_43734095/article/details/104465307

最后的最后(* ̄︶ ̄),如果有不妥的地方欢迎批评指正。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dapper .NET 是 .NET 下一个简单的对象关系映射库 (ORM)。它支持SQLite, SQL CE, Firebird, Oracle, MySQL, PostgreSQL and SQL Server等数据库。   优点: 使用Dapper可以自动进行对象映射! 轻量级,单文件。 支持多数据库。 Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。   Dapper.Net的示例代码: public class Dog {     public int? Age { get; set; }     public Guid Id { get; set; }     public string Name { get; set; }     public float? Weight { get; set; }     public int IgnoredProperty { get { return 1; } } }             var guid = Guid.NewGuid(); var dog = connection.Query("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid }); dog.Count()     .IsEqualTo(1); dog.First().Age     .IsNull(); dog.First().Id     .IsEqualTo(guid); 下面是Dapper .NET与其他几种数据访问组件的性能对比,从比较结果看Dapper .NET表现优异。 Performance of SELECT mapping over 500 iterations - POCO serialization Method Duration Remarks Hand coded (using a SqlDataReader) 47ms Can be faster Dapper ExecuteMapperQuery 49ms ServiceStack.OrmLite (QueryById) 50ms PetaPoco 52ms BLToolkit 80ms SubSonic CodingHorror 107ms NHibernate SQL 104ms Linq 2 SQL ExecuteQuery 181ms Entity framework ExecuteStoreQuery 631ms Performance of SELECT mapping over 500 iterations - dynamic serialization Method Duration Remarks Dapper ExecuteMapperQuery (dynamic) 48ms   Massive 52ms Simple.Data 95ms Performance of SELECT mapping over 500 iterations - typical usage Method Duration Remarks Linq 2 SQL CompiledQuery 81ms Not super typical involves complex code NHibernate HQL 118ms   Linq 2 SQL 559ms   Entity framework 859ms   SubSonic ActiveRecord.SingleOrDefault         github地址:https://github.com/StackExchange/dapper-dot-net 入门教程:http://www.cnblogs.com/Sinte-Beuve/p/4231053.html   Dapper已经有很多成熟的扩展项目了,Dapper.Rainbow、Dapper.Contrib,DapperExtensions   其中Dapper-Extensions非常不错,github地址:https://github.com/tmsmith/Dapper-Extensions Dapper-Extensions的优点: 1、开源 2、针对Dapper封装了常用的CRUD方法,有独立的查询语法。 3、需要映射的实体类本身0配置,无需加特性什么的。是通过独立的映射类来处理,可以设置类映射到DB的别名,字段的别名等等。 Dapper-Extensions的缺点: 1、好几年没更新了 2、不支持oracle(木有oracle的方言,已经搞定)  3、不能同时支持多种数据库(已经搞定) 4、部分代码有些bug(发现的都搞定了)   Dapper-Extensions入门教程可参考: http://www.cnblogs.com/hy59005271/p/4759623.html       标签:orm

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值