C++ 重载运算符和重载函数

2023-11-05

        在同一作用域中的某个函数和运算符,指定多个定义,分别称为函数重载运算符重载

        重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。
        当调用一个重载函数或重载运算符时,编译器通过把 ”所使用的参数类型“ 与 ”定义中的参数类型“ 进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策

函数重载

        在同一个作用域内,可以声明几个功能类似的同名函数,但它们的形式参数(参数的个数、类型或顺序)必须不同。不能仅通过返回类型的不同来重载函数。

        下面的实例中,同名函数 print() 被用于输出不同的数据类型:

#include <iostream>
using namespace std;

class printData
{
public:
    void print(int i) 
    {
        cout << "整数为: " << i << endl;
    }

    /* 重载声明,具有相同名称print,但参数列表和定义(实现)不相同 */
    void print(double f) 
    {
        cout << "浮点数为: " << f << endl;
    }

    void print(char* c) 
    {
        cout << "字符串为: " << c << endl;
    }
};

int main(void)
{
    printData pd;

    pd.print(5);          // 输出整数

    pd.print(500.263);    // 输出浮点数

    char c[] = "Hello C++";
    pd.print(c);          // 输出字符串

    return 0;
}

         编译和执行上面的代码:

整数为: 5
浮点数为: 500.263
字符串为: Hello C++

运算符重载

         重定义或重载大部分 C++ 内置的运算符,便能使用自定义类型的运算符。
         重载的运算符是带有特殊名称的函数,函数名由关键字 operator 和其后要重载的运算符符号构成。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

Box operator+(const Box&);

         声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象。大多数的重载运算符可被定义为普通的非成员函数类成员函数

         如果定义上面的函数为类的非成员函数,那么需要为每次操作传递两个参数,如下所示:

Box operator+(const Box&,const Box&);

         下面的实例使用成员函数演示了运算符重载的概念。在这里,对象作为参数进行传递,对象的属性使用 this 运算符进行访问,如下所示:

#include <iostream>
using namespace std;

class Box
{
public:
    double getVolume(void)
    {
        return length * breadth * height;
    }

    void setLength(double len)
    {
        length = len;
    }

    void setBreadth(double bre)
    {
        breadth = bre;
    }

    void setHeight(double hei)
    {
        height = hei;
    }

    Box operator+(const Box& b)   // 重载 + 运算符,用于把两个 Box 对象相加
    {
        Box box;

        /* 把对象Box1和Box2的长宽高分别相加到box中 */
        box.length  = this->length + b.length;
        box.breadth = this->breadth + b.breadth;
        box.height  = this->height + b.height;

        return box;
    }
private:
    double length;      // 长度
    double breadth;     // 宽度
    double height;      // 高度
};

int main()
{
    Box Box1;                // 声明 Box1,类型为 Box
    Box Box2;                // 声明 Box2,类型为 Box
    Box Box3;                // 声明 Box3,类型为 Box,用来接收返回的box

    double volume = 0.0;     // 存储体积变量

    // Box1
    Box1.setLength(6.0);
    Box1.setBreadth(7.0);
    Box1.setHeight(5.0);

    // Box2 
    Box2.setLength(12.0);
    Box2.setBreadth(13.0);
    Box2.setHeight(10.0);

    // Box1 的体积
    volume = Box1.getVolume();
    cout << "Volume of Box1 : " << volume << endl;

    // Box2 的体积
    volume = Box2.getVolume();
    cout << "Volume of Box2 : " << volume << endl;

    // 把两个对象相加,得到 Box3
    Box3 = Box1 + Box2;

    // Box3 的体积
    volume = Box3.getVolume();
    cout << "Volume of Box3 : " << volume << endl;

    return 0;
}

         编译和执行上面的代码:

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

可重载运算符&不可重载运算符

         可重载运算符: 

双目算术运算符 + (加),-(减),*(乘),/(除),% (取模)
关系运算符 ==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于)
逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符 + (正),-(负),*(指针),&(取地址)
自增自减运算符 ++(自增),--(自减)
位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放 new, delete, new[ ] , delete[]
其他运算符 ()(函数调用),->(成员访问),,(逗号),[](下标)

         不可重载运算符:

成员访问运算符 .
成员指针访问运算符 .* ,  ->*
域运算符 ::
长度运算符 sizeof
条件运算符 ?:
预处理符号 #

运算符重载实例

         各种运算符重载的实例:

一元运算符重载

         一元运算符只对一个操作数进行操作,下面是一元运算符的实例:

  • 递增运算符( ++ )和递减运算符( -- )
  • 一元减运算符( - )
  • 逻辑非运算符( ! )

         一元运算符通常出现在所操作的对象的左边,比如 !obj、-obj 和 ++obj,有时也作后缀,比如 obj++ 或 obj--。

         演示如何重载一元减运算符( - ):

#include <iostream>
using namespace std;
 
class Distance
{
private:
      int feet;             // 0 到无穷
      int inches;           // 0 到 12
public:     
      Distance()            // 所需的构造函数
      {
         feet = 0;
         inches = 0;
      }

      Distance(int f, int i)
      {
         feet = f;
         inches = i;
      }
      
      void displayDistance() // 显示距离的方法
      {
         cout << "FEET: " << feet << " INCHES:" << inches <<endl;
      }
      
      Distance operator- ()  // 重载负运算符( - )
      {
         feet = -feet;
         inches = -inches;
         return Distance(feet, inches);
      }
};

int main()
{
   Distance D1(11, 10), D2(-5, 11);
 
   -D1;                     // 取相反数
   D1.displayDistance();    // 距离 D1
 
   -D2;                     // 取相反数
   D2.displayDistance();    // 距离 D2
 
   return 0;
}

         演示如何重载递增运算符( ++ ),包括前缀和后缀两种用法, 前缀形式重载调用 Check operator ++ () ,后缀形式重载调用 operator ++ (int):

#include <iostream>
using namespace std;
 
class Time
{
   private:
      int hours;             // 0 到 23
      int minutes;           // 0 到 59
   public:
      Time()
      {
         hours = 0;
         minutes = 0;
      }
      Time(int h, int m)
      {
         hours = h;
         minutes = m;
      }
      void displayTime()
      {
         cout << "H: " << hours << " M:" << minutes <<endl;
      }
      
      Time operator++ ()     // 重载前缀递增运算符( ++ )
      {
         ++minutes;          // 对象加 1
         if(minutes >= 60)  
         {
            ++hours;
            minutes -= 60;
         }

         return Time(hours, minutes);
      }
      
      Time operator++(int)   // 重载后缀递增运算符( ++ )       
      {
         // 保存原始值
         Time T(hours, minutes);
         // 对象加 1
         ++minutes;                    
         if(minutes >= 60)
         {
            ++hours;
            minutes -= 60;
         }
         // 返回旧的原始值
         return T; 
      }
};


int main()
{
   Time T1(11, 59), T2(10,40);
 
   ++T1;                    // T1 加 1
   T1.displayTime();        // 显示 T1
   ++T1;                    // T1 再加 1
   T1.displayTime();        // 显示 T1
 
   T2++;                    // T2 加 1
   T2.displayTime();        // 显示 T2
   T2++;                    // T2 再加 1
   T2.displayTime();        // 显示 T2
   return 0;
}

         执行输出结果为:

H: 12 M:0
H: 12 M:1
H: 10 M:41
H: 10 M:42

         注意:int 在括号内是为了向编译器说明这是一个后缀形式,这个形参是0,作为前置和置的区分,而不是表示整数。递增和递减一般是改变对象的状态,所以一般是重载为成员函数。且重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指针的递增递减是无法重载的),所以一般情况的递增递减是操作对象内部的成员变量。

         若想要实现 ++(++a) 这种连续自加,需返回其对象的引用,这样才能保证操作的是同一块内存空间或对象,否则就只是单纯的赋值操作,原来的对象并未被修改,如下所示:

Time& operator++ ()     // 重载前缀递增运算符( ++ )
{
   ++minutes;           // 对象加 1
   if(minutes >= 60)  
   {
      ++hours;
      minutes -= 60;
   }
   return *this;
}

二元运算符重载

         二元运算符需要两个参数,加运算符( + )、减运算符( - )、乘运算符( * )和除运算符( / )都属于二元运算符。

         这里演示重载加运算符( + ),其他的类似:

#include<iostream>
using namespace std;

class Box
{
private:
     double length;      // 长度
     double breadth;     // 宽度
     double height;      // 高度
public:
     Box();
     Box(double l,double b,double h);
     Box operator+(const Box & box1);
     Box operator+(const int b);
     friend Box operator+(const int b, Box box1); 
     void display(); 
};

Box::Box()
{
    length=0;
    breadth=0;
    height=0;
}

Box::Box(double l,double b,double h)
{
    length = l;
    breadth = b;
    height = h;
}

Box Box::operator +(const Box& box1)   //用于对象相加:(Box1+Box2)
{
    Box box;
	
    box.length = this->length + box1.length;
    box.breadth = this->breadth + box1.breadth;
    box.height = this->height + box1.height;
	
    return box;
}
Box Box::operator+(const int b)        //用于对象与数相加:(Box1+6)
{
    Box box;
	
    box.length = this->length + b;
    box.breadth = this->breadth + b;
    box.height = this->height + b;
	
    return box;
}

Box operator+(const int b,  Box box1)  //用于数与对象相加:(Box1+6)
{
    return box1+b;                     //调用第二个重载+的成员函数,相当于 box1.operator+(b);
}
void Box::display()
{
    cout << "length: " << length <<endl;
    cout << "breadth: " << breadth <<endl;
    cout << "height: " << height <<endl;
}

int main ()
{
    int m = 1;
    Box box1(1.4,2.7,3.9);
    Box box2(2.1,3.5,7.3);
    Box box3,box4,box5;

    box1.display();
    box2.display();

    box3=box1+box2;   //这里可以交换顺序,相当月box3=box1.operator+(box2); 
    box3.display();
	
    box4=box1+m;      //定义了友元函数operator+(const int b,Box box1),所以也可以交换顺序
    box4.display();

    box5=m+box1;
    box5.display();

    return 0;
}

         执行输出结果为:

length: 1.4
breadth: 2.7
height: 3.9

length: 2.1
breadth: 3.5
height: 7.3

length: 3.5
breadth: 6.2
height: 11.2

length: 2.4
breadth: 3.7
height: 4.9

length: 2.4
breadth: 3.7
height: 4.9

关系运算符重载

         C++ 语言支持各种关系运算符( < 、 > 、 <= 、 >= 、 == 等等),它们可用于比较 C++ 内置的数据类型。可以重载任何一个关系运算符,重载后的关系运算符可用于比较类的对象。

         下面演示了重载 < 运算符,其他的关系运算符类似:

#include <iostream>
using namespace std;
 
class Distance
{
private:
   int feet;              // 0 到无穷
   int inches;            // 0 到 12
public:
   Distance()
   {
      feet = 0;
      inches = 0;
   }
   Distance(int f, int i)
   {
      feet = f;
      inches = i;
   }
   void displayDistance()
   {
      cout << "F: " << feet << " I:" << inches <<endl;
   }
      
   bool operator <(const Distance& d)  // 重载小于运算符( < )
   {
      if(feet < d.feet)
      {
         return true;
      }
      if(feet == d.feet && inches < d.inches)
      {
         return true;
      }
      return false;
   }
};

int main()
{
   Distance D1(11, 10), D2(5, 11);
 
   if( D1 < D2 )
   {
      cout << "D1 is less than D2 " << endl;
   }
   else
   {
      cout << "D2 is less than D1 " << endl;
   }

   return 0;
}

         执行输出结果为:

D2 is less than D1

输入/输出运算符重载

         C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型,也可重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型。

         注意:需要把运算符重载函数声明为类的友元函数,这样就能不用创建对象而直接调用函数。

         演示重载提取运算符 >> 和插入运算符 <<:

#include <iostream>
using namespace std;
 
class Distance
{
private:
    int feet;         
    int inches;       
public:
    Distance()
	{
        feet = 0;
        inches = 0;
    }
    Distance(int f, int i)
	{
        feet = f;
        inches = i;
    }
    friend ostream& operator<<(ostream & output, const Distance & D)
    { 
        output << "FEET : " << D.feet << " INCHES : " << D.inches;
        return output;            
    } 
    friend istream& operator>>(istream & input, Distance & D)
    { 
        input >> D.feet >> D.inches;
        return input;            
    }   
};

int main()
{
   Distance D1(11, 10), D2(5, 11), D3;
 
   cout << "Enter the value of object : " << endl;
   
   cin >> D3;
   
   cout << "First Distance : " << D1 << endl;
   cout << "Second Distance :" << D2 << endl;
   cout << "Third Distance :" << D3 << endl;
 
   return 0;
}

         执行输出结果为:

Enter the value of object :
3 2
First Distance : FEET : 11 INCHES : 10
Second Distance :FEET : 5 INCHES : 11
Third Distance :FEET : 3 INCHES : 2

赋值运算符重载

         可以重载赋值运算符( = ),用于创建一个对象,比如拷贝构造函数。

         演示了如何重载赋值运算符:

#include <iostream>
using namespace std;
 
class Distance
{
private:
    int feet;             
    int inches;          
public:
    Distance()
	{
        feet = 0;
        inches = 0;
    }
    Distance(int f, int i)
	{
        feet = f;
        inches = i;
    }
    void operator=(const Distance & D)
    { 
        feet = D.feet;
        inches = D.inches;
    }
    void displayDistance()
    {
        cout << "FEET: " << feet <<  " INCHES:" <<  inches << endl;
    }       
};

int main()
{
   Distance D1(5, 6), D2(4, 3);
 
   cout << "First Distance : "; 
   D1.displayDistance();
   
   cout << "Second Distance :"; 
   D2.displayDistance();
 
   D1 = D2;   // 使用赋值运算符
   cout << "First Distance :"; 
   D1.displayDistance();
 
   return 0;
}

         执行输出结果为:

First Distance : FEET: 5 INCHES:6
Second Distance :FEET: 4 INCHES:3
First Distance :FEET: 4 INCHES:3

函数调用运算符 () 重载

         函数调用运算符 () 可以被重载用于类的对象。重载 () 并非是创造了一种新的调用函数的方式,相反,这是创建一个可以传递任意数目参数的运算符函数。

         演示了如何重载函数调用运算符 ():

#include <iostream>
using namespace std;
 
class Distance
{
private:
    int feet;             
    int inches;           
public:
    Distance()
	{
        feet = 0;
        inches = 0;
    }
    Distance(int f, int i)
	{
        feet = f;
        inches = i;
    }
    Distance operator()(int a, int b, int c)  // 重载函数调用运算符
    {
        Distance D;
        // 进行随机计算(仅为演示)
        D.feet = a + c + 10;
        D.inches = b + c + 100 ;
        return D;
    }
      // 显示距离的方法
    void displayDistance()
    {
        cout << "FEET: " << feet <<  " INCHES:" <<  inches << endl;
    }   
      
};

int main()
{
   Distance D1(11, 10), D2;

   cout << "First Distance : "; 
   D1.displayDistance();

   D2 = D1(10, 10, 10); // 调用 operator()()
   cout << "Second Distance :"; 
   D2.displayDistance();

   return 0;
}

         执行输出结果为:

First Distance : FEET: 11 INCHES:10
Second Distance :FEET: 30 INCHES:120

下标运算符 [] 重载

         下标操作符 [] 通常用于访问数组元素。重载该运算符用于增强操作 C++ 数组的功能。

         演示了如何重载下标运算符 []:

#include <iostream>
using namespace std;

const int SIZE = 10;
 
class safearay
{
private:
    int arr[SIZE];
public:
    safearay() 
    {
        register int i;
        for(i = 0; i < SIZE; i++)
        {
          arr[i] = i;
        }
    }
    int& operator[](int i)
    {
        if( i >= SIZE )
        {
            cout << "索引超过最大值" <<endl; 
             
            return arr[0];   // 返回第一个元素
        }
        return arr[i];
    }  
};

int main()
{
   safearay A;
 
   cout << "A[2] 的值为 : " << A[2] <<endl;
   cout << "A[5] 的值为 : " << A[5]<<endl;
   cout << "A[12] 的值为 : " << A[12]<<endl;
 
   return 0;
}

         执行输出结果为:

A[2] 的值为 : 2
A[5] 的值为 : 5
A[12] 的值为 : 索引超过最大值
0

类成员访问运算符 -> 重载

         类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针"行为。

         注意:运算符 -> 必须是一个成员函数。如果使用了 -> 运算符,返回类型必须是指针或者是类的对象。

         运算符 -> 通常与指针引用运算符 * 结合使用,用于实现"智能指针"的功能。这些指针是行为与正常指针相似的对象,唯一不同的是,当通过指针访问对象时,它们会执行其他的任务。比如,当指针销毁时,或者当指针指向另一个对象时,会自动删除对象。

         ​​​​​​​ -> 可被定义为一个一元后缀运算符。也就是说,给出一个类:

class Ptr
{
   //...
   X * operator->();
};

         ​​​​​​​ 类 Ptr 的对象可用于访问类 X 的成员,使用方式与指针的用法十分相似。例如:

void f(Ptr p )
{
   p->m = 10 ;   // (p.operator->())->m = 10
}

         ​​​​​​​ 语句 p->m 被解释为 (p.operator->())->m。同样地,下面的实例演示了如何重载类成员访问运算符 ->:

#include <iostream>
#include <vector>
using namespace std;
 
class Obj 
{
   static int i, j;
public:
   void f() const 
   { 
       cout << i++ << endl; 
   }
   void g() const 
   {
	   cout << j++ << endl; 
   }
};
 
// 静态成员定义
int Obj::i = 10;
int Obj::j = 12;
 
// 为上面的类实现一个容器
class ObjContainer 
{
   vector<Obj*> a;
public:
   void add(Obj* obj)
   { 
      a.push_back(obj);  // 调用向量的标准方法
   }
   friend class SmartPointer;
};
 
// 实现智能指针,用于访问类 Obj 的成员
class SmartPointer 
{
   ObjContainer oc;
   int index;
public:
   SmartPointer(ObjContainer& objc)
   { 
       oc = objc;
       index = 0;
   }
   // 返回值表示列表结束
   bool operator++() // 前缀版本
   { 
     if(index >= oc.a.size() - 1) 
		 return false;
     if(oc.a[++index] == 0) 
		 return false;
	 
     return true;
   }
   bool operator++(int) // 后缀版本
   { 
      return operator++();
   }
   // 重载运算符 ->
   Obj* operator->() const 
   {
     if(!oc.a[index])
     {
        cout << "Zero value";
        return (Obj*)0;
     }
     return oc.a[index];
   }
};
 
int main() 
{
   const int sz = 10;
   Obj o[sz];
   ObjContainer oc;
   for(int i = 0; i < sz; i++)
   {
       oc.add(&o[i]);
   }
   
   SmartPointer sp(oc); // 创建一个迭代器
   
   do {
      sp->f(); // 智能指针调用
      sp->g();
   } while(sp++);
   
   return 0;
}

         执行输出结果为:

10
12
11
13
12
14
13
15
14
16
15
17
16
18
17
19
18
20
19
21
 

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

C++ 重载运算符和重载函数 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • warning: ignoring JAVA_HOME=D:\JDK; using bundled JDK报错解决

    warning ignoring JAVA HOME D JDK using bundled JDK报错原因是因为你JDK版本太低或者你的ElasticSearch版本太高降低版本即可 我的是JDK1 8我下载的是elasticsearch
  • 八皇后问题--回溯

    在刘汝佳老师的书中对于8皇后问题的分析 我感觉非常经典 8皇后问题可行的解 92个 回溯的定义 当把问题分解成若干的步骤并递归的求解时候 如果当前步骤没有合法的选择 则函数将返回上一级递归调用 这种现象称为回溯 这是这个原因 递归枚举算法常
  • uniapp 保存二维码到本地,如果不是本地图片需要先下载后保存。

    如果二维码不是固定的 是线上的就需要先去下载 baocuns 保存二维码 let that this uni showLoading title 保存中 uni downloadFile 先下载网络图片 转为临时路径图片 url that
  • 进制转换C语言实现(十进制转换为任意进制)

    程序实现功能 输入一个十进制数和R 表示要转换成R进制 输出转换后的数 事例 例如 输入 10 2 输出 1010 源代码如下 include
  • UE的rtsp插件崩溃过程排查

    Part1前言 Invideo插件是一个UE5的rtsp视频播放插件 当然还可以播放主流的其他视频协议 其开源地址如下https github com inveta InVideo 前段时间有网页反馈使用该插件进行播放视频的时候会有偶发程序
  • 如何学习计算机视觉?初学者怎么入门?

    学习计算机视觉需要一定的数学 编程和机器学习基础 以下是一些学习计算机视觉的步骤和资源 如何学习计算机视觉 初学者怎么入门 学习编程语言 计算机视觉的主要编程语言包括Python和C 可以学习Python或C 编程 掌握基本语法和编程思想
  • librtmp ssl 1.0.0 到 ssl 1.1.1

    openssl 版本更新了 导致 librtmp 库不能使用 于是查查资料 Compiler errors dereferencing pointer to incomplete type DH aka struct dh st 根据上面的
  • torch.cuda模块获取信息

    判断GPU是否可用 import torch print torch cuda is available 如果输出True则表示可以使用GPU 输出可使用GPU的数量 import torch print torch cuda device
  • 15 Flutter TabBarView和TabBar 定义顶部 Tab 切换

    Flutter TabBarView和TabBar 定义顶部 Tab 切换 1 属性 TabBar属性 说明 tabs 一系列标签控件 controller 标签选择变化控制器 isScrollable 是否可滚动 默认false indi
  • Floyd 算法,找出所有最短路径或最长路径 matlab (二)

    所有最短路径 在 一 中 我们获得了距离矩阵和路由矩阵 元胞 这个一个无向图 这是上次算出的距离矩阵和路由矩阵 接下来介绍如何根据这个路由矩阵 元胞 列出所有最短路径 结果存储在一个矩阵里 每一行代表一条最短路径的标号 定义列出所有最短路径
  • MQ可以用在哪些地方,解决什么问题?

    MQ kafka是以吞吐量高而闻名 不过其数据稳定性一般 而且无法保证消息有序性 阿里巴巴的RocketMQ基于Kafka的原理 利用Java代码打造 弥补了Kafka的缺点 继承了其高吞吐的优势 其客户端目前以Java为主 RabbitM
  • Python+Opencv实现实时的条形码检测

    目录 一 场景需求简介 二 算法实现步骤 三 图片中条形码检测代码实现 四 图片中条形码检测效果展示与分析 五 视频中条形码检测代码实现 六 视频中条形码检测效果展示与分析 七 思维扩展 参考资料 注意事项 一 场景需求简介 在现实场景中
  • flutter type ‘int‘ is not a subtype of type ‘String?‘

    type int is not a subtype of type String 不是int 将int改成String类型 Unhandled Exception type double is not a subtype of type i
  • C#访问数据库MSSQL

    首先声明命名空间using System Data SqlClient 再使用SqlConnection类连接 SqlCommand类执行SQL命令 结果返回给SqlDataReader类或其它类 各类的基本用法介绍 SqlConnecti
  • ubuntu18.04.4 如何切换图形用户界面模式和命令行模式(老林学习笔记)

    ubuntu ubuntu 18 04 4 desktop amd64 iso PC HP Pavilion g4 1 按 Ctrl Alt F1 组合键 进入 既不是图形用户界面模式 也不是命令行模式 2 按 Ctrl Alt F2 组合
  • Linux多线程:线程取消

    int pthread cancel pthread t thread 功能 取消线程 执行中途让线程终止 取消某个线程 可以终止某个线程的运行 但是并不是立马终止 而是当子线程执行到一个取消点 线程才会终止 取消点 系统规定好的一些系统调
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • antv/g6结合vue实现某一流程的流程图展示

    antv g6结合vue实现某一流程的展示 3 1 3版本 安装antv g6 npm install save antv g6 注意版本控制 引入 import G6 from antv g6 运行结果展示 本文主要实现的需求是 配合后端
  • java jsch 切换用户_使用JSCH框架通过跳转机访问其他节点的方法

    之前搞了套远程访问ssh进行操作的代码 最近有需求 需要通过一台跳转机才能访问目标服务 在网上搜了半天 也没找到比较好的例子 就自己翻阅了下JSCH的API 但是看的云里雾里的 联想了下 端口转发的原理是否是把目标节点ip port映射到l
  • C++ 重载运算符和重载函数

    在同一作用域中的某个函数和运算符 指定多个定义 分别称为函数重载和运算符重载 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明 但是它们的参数列表和定义 实现 不相同 当调用一个重载函数或重载运算符时 编译器通过把