C++primer(第五版)---14章(重载运算与类型转换)

2023-11-16

目录

​编辑

重载运算符的基本概念:

调用重载运算符:

而有些运算符不应该被重载:

应该保持与内置类型一致的含义:

是否成员成员函数:

重载io(<<和>>)运算符:

重载<<运算符:

重载>>运算符:

算术运算符:

 关系运算符:

赋值运算符(要定义为成员函数):

下标运算符(必须为成员函数):

前置和后置递减递加运算符:

前置递增递减运算符(基本为成员函数):

 后置递增递减运算符:

 成员访问运算符(通常用于智能指针或是一些有指针的数据成员时):

箭头运算符的限定:

函数调用运算符(必须为成员函数)函数对象和lambda表达式:

 而函数对象常常用于泛型算法的实参

lambda是函数对象:

重载,类型转换与运算符:

类型转换符可能会带来意外的结果:

避免二义性的类型转换:

重载函数与转换构造函数:

重载函数与用户定义的类型转换:

函数匹配与重载运算符:


30e60a5f1f7c452387fb9f2c0d8b12a9.png

重载运算符的基本概念:

我们不能重载内置类型的运算符,且不能创造一个新的运算符进行重载。正常的重载运算符参数数量应该与其运算对象一样多,而只有重载()运算符外,其他不能有默认实参。如果重载运算符为成员函数,其第一个左侧对象默认为绑定的this指针上。参数数量与运算对象少一个(为默认为this指针)。

调用重载运算符:

间接方式调用:s1+s2;

直接函数调用:operator+(s1,s2);

二者是等价的。如果在成员函数中:

data1+=data2;

data1.operator+(data2);(data1为左侧运算对象)

而有些运算符不应该被重载:

有些运算符有其隐含的运算规则和求值顺序,像&,|有其短路特性,即如果&左侧为假不判断右侧对象的真假,|如果左侧对象为真,则不判断右侧对象的真假。还有逗号运算符。而重载后可能无法保证其求值顺序被保留,还有求址和逗号运算符,其本身就定义了对象为类的操作。故不应该对以上情况重载。

应该保持与内置类型一致的含义:

最好重载相关的运算符实现的功能相似与内置类型使用其的功能。也最好保持其特性一致。像赋值运算符=,赋值后,左侧对象与其右侧对象的值相等,返回左侧对象的引用。因此重载时也要实现此功能并返回左侧对象的引用。或者是+=运算符,应该为先+在赋值,保持其特性。而应该配套运算符相关联的运算符,例如要重载<运算符,应该把相应的比较运算符也重载进去。如果有==,也应该重载!=运算符。

是否成员成员函数:

像会具体改变左侧对象的值的情况下,作为成员函数的。->,[ ],(),=等应该作为成员函数重载的,而复合运算符不一定一定是成员函数。而具有对称性的运算符,即如关系,相等性,算术运算和位运算等,一般不为成员函数。或者需要其左右侧类对象类型不同,可交换位置,通常设置为非成员函数。

重载io(<<和>>)运算符:

重载<<运算符:

一般用于输出,即第一个参数为相应的非常量ostream对象的引用,非常量是因为其向流输入内容会改变状态,而引用则是ostream不可复制(第13章的禁止拷贝复制,一个流不能被复制),而第二个参数为其复制对象常量的引用,输出不改变其内容,引用节省空间。为了后续的运算(连续<<运算),返回类型为其ostream的引用。

格式 ostream& operator <<(ostream&,const data&);

最好不要在重载<<运算符函数体内容添加格式控制的语句,类似换行符,只要负者输出内容而不负责控制格式。这样就不能实现将后续内容放在同一行,也不能为成员函数,因为其左侧对象要为ostream,而如果为成员函数,其左侧绑定为当前类实例化对象(this)。因此要访问类对象,就定义为友元函数即可。

重载>>运算符:

第一个参数为要读取流的引用,第二个参数为将要读取到的数据的非常量(因为要读入数据,会改变)引用,返回相应流的引用。

istream&operator>>(operator&,data&);

与<<运算符不同,>>运算符重载时必须能够处理输入失败的情况。例如读入错误的数据类型,当与输入要求的类型不一致时,会发生错误,从而导致后续的输入无法正常运行。当读到文件末尾或者其他问题的发生错误。我们要负者处理错误,或是将其要保存的数据初始化。最好向io库报告错误。

b366941b826f427ca12eaa5ac90b59c7.png

算术运算符:

可以支持左右对象的交换,不为类成员函数,一般不需要改变变量的状态,故参数类型为常量引用。而它的计算结果为一个临时量,如果一个类要定义重载算术运算符,一般要先定义其复合赋值运算符,用复合赋值运算符来实现算术运算符的定义。

例:

625fb4629e414d28878736d1068e4c1f.png

 而当类需要比较相等时,最好定义重载==运算符,这样方便记忆的同时也十分快捷,同时要定义其对应的!=运算符,并且其中一个运算符要用另一个运算符来简化定义。

0ff636b8bd054d8cbcc03913811c849a.png

 49077682ec9941c5a2b82a8b50752836.jpg

 关系运算符:

相关的容器(vector。。。)会要求所放入的元素支持一定的关系运算(<运算符),即比较大小。但要注意,如果一个类同时定义了<运算符和==运算符,那么不仅是要满足<比较,还要满足其==配套的!=时,如果两个类实例!=,则其应该是具有<关系的。这并不是都能满足的,因为<是相对于其中一个数据进行比较的,而当!=符号是对于多个数据进行判等的,有时会导致其中有的数据不一样但是对于比较的数据是相同的,所以这种情况下最好不要定义<运算符。(例如一个图书类,有书名号和价格,比较的时候是比较价格大小排序,但是!=是比较书名号和价格,而在书名号不同但是价格相同时,<运算符没用了)

赋值运算符(要定义为成员函数):

像之前的拷贝复制运算符和移动赋值运算符(13章),还可以定义其他的赋值运算符,类似vector标准库还定义了第三种赋值,以列表形式进行赋值。

56bd271998c94c13ae4ebcc4a73a98a2.png

 1b9f79fb1bc246b5a67e335d54a136c9.png

 0e681814ae9a43cb9b59bac4040a2e19.png

而像复合赋值运算符,虽然可以不定义为成员函数,但最好都定义为成员函数。并且返回其引用。

下标运算符(必须为成员函数):

类似于内置数据类型的数组,【】返回的是类中特定顺序的元素,与内置类型也一样,返回的是元素引用,保障其能放在表达式的左右, 而且要定义常量版本和非常量版本的[]运算符。保证在常量对象使用下标时不可改变其元素。

9fe80b731a7c4f06b1192b1cd646816a.png

前置和后置递减递加运算符:

前置递增递减运算符(基本为成员函数):

需要先检查其移动是否合法,有无超出范围。而前置是返回的是递增递减后元素的引用。

7e3eb161c4884f9b9a3a77933313941a.png

 ad4e1779d85f4ab5a190edc85fbe041d.png

 后置递增递减运算符:

后置与前置不同,不会返回递增后元素的引用,而是返回一个临时量用于保存未移动前的数据。而二者重载区分的标志为后置的参数列表中会多一个int型的参数(无需为其命名)。编译器会为其提供一个实参为0的数。fb02fcbf4f404d58814fe6d940072021.png

 而当我们要显式用函数的形式调用后置运算符时,必须传给它一个int实参,来告诉编译器我们调用的是后置运算符。

c37fe7482db04a1db53bb9042c074947.png

 成员访问运算符(通常用于智能指针或是一些有指针的数据成员时):

重载*和->为访问类的成员的运算符,而->一定要是成员函数,而*通常是成员函数。

a140f0128f5a4027b380ad193cc07d25.png

而我们可以将他定义为常量版本的,适用于常量的实例化对象,因为我们只是得到其引用或是指针,并不会改变他的内部数据的状态。(而如果*或是->得到其内部数据要改变时,也会因为是指针形式的,如果常量类型则只是其指针所绑定的地址不能更改,而可以改变其指针所绑定的值)

箭头运算符的限定:

而我们可以将*重载运算符定义为任何我们想要的操作,返回的类型可以任意,但是->运算符不行,他一定要是成员访问的作用。所以重载的->运算符一定要是返回一个指针或者是重载了->的类,其他会报错。

函数调用运算符(必须为成员函数)函数对象和lambda表达式:

一个类可以定义函数调用运算符,使其行为像函数一样,但比函数更加灵活(还可以存储状态)。

e5b52d2725c742d08fc612ffb7111c03.png

c389b2f19beb4c928d0720f07431d83f.png

 可以定义多个函数调用运算符,要其参数数量和类型不一致。而这种类定义了函数调用运算符也被称作函数对象。同时也能定义数据成员。实现定制相应不同的操作。其可以定义0或者多个形参。

2d88259425ba4a6eb633b7d397e75ef9.png

 而函数对象常常用于泛型算法的实参

e4cf4b16e53649e08fa0bc02d59b8a98.png

我们可以向标准库中的算法传递任何类别的可调用对象(只要一个对象或者一个表达式,只要能对其使用调用运算符则其就是可调用的,像:函数,函数指针,lambda表达式,重载了调用运算符的类),在其作为参数时,会自动调用其调用运算符进行传参

lambda是函数对象:

lambda表达式实质就是被编译器翻译成一个未命名的类的未命名对象,该类中有一个重载的函数调用运算符。

stable_sort(words.begin(),words.end(),[](const string &a,const string &b){return a.size()<b.size();});

其行为类似于下面:
 

class ShortString{
public:
    bool operator()(const string &s1,const string &s2)const
    {return    s1.size()<s2.size();
    }
}; 

其产生的类只有一个函数调用运算符成员,而且不含有默认构造函数,赋值运算符及默认析构函数,是否含有默认的拷贝/移动构造函数视捕获的数据成员类型而定(在13章有提到默认拷贝和移动的规则)。且默认情况下lambda不能改变它捕获的变量。因此在lambda产生的类中函数调用运算符是一个const成员函数。如果为可变的,则调用运算符就不是const。

等价于:

stable_sort(words.begin(),words.end(),ShorterString());

而当lambda捕获函数外的变量时:

当一个函数lambda表达式通过引用来捕获变量,由程序负责确保lambda执行时引用的对象确实存在。因此编译器可以直接用该引用而无须在lambda产生的类中将其存储为数据成员。

而当通过值捕获的方式拷贝到lambda中,会被值捕获的变量拷贝到lambda。这时lambda产生的类必须为每个值捕获的变量建立对应的数据成员,同时创建构造函数。将其捕获的变量的值来初始化数据成员。

b94a32a868ef4246a0f441adc3154d42.png

a3f7ffa60d1a41feb73fa5a9deec4bb6.png

d7a9406d8d154186a738f9ecd7e71f95.png

这个合成的类不含有默认构造函数,因此必须提供一个实参初始化。

auto wc = find_if(words.begin(),words.end(),SizeComp(sz));

lambda是通过匿名的函数对象来实现的,是其函数对象在使用方式上的简化。当代码需要一个简单的函数且并不会在其他地方被使用时,就可以使用lambda表达式。而如果需要多次使用,并且需要保存某些状态的话,使用函数对象会更加合适。

标准库定义的函数对象(c++11标准的function函数):

标准库还定义了一组表示算法,逻辑,关系运算符的类,且定义了一个执行命令的调用运算符。

44ca148aca6e4587b9f7c5ec44bd094b.png

都被定义为了模板的类型,可以指定具体的应用类型。通常这些被用在标准库算法中用来代替那些默认的运算符。e3a826ae6d0e41b3b01e8b4d9f3ecfe3.png 

而且标准库定义的函数对象对于指针同样适用。如两个无关指针进行比较会产生未定义1行为,而我们可以通过比较指针的内存来sort其在vector的位置。直接这样会产生未定义的行为,但是可以用标准库函数对象来实现这个。

c73fbe2a8c584881aa2c8b8c435cdc5a.png

可调用对象与funtion:
几种可调用对象都有他对对应的类型,像lambda有对应的未命名的类的类型,而函数和函数指针则是根据他返回类型和参数来区分类型。但是两个不同类型的可调用对象却可能同时共享一种调用形式。调用类型指名了调用返回的类型和传递给调用的实参类型。而不同的调用对象类型有时可对应同一种调用形式。

7b8940a9da3a4d04a8fed0b06a4adccf.png

虽然上述类型不同,但是他们都是共享同一种调用形式。

而我们可以定义一个函数表用于存储指向这些可调用对象的“指针”,当需要什么函数时,从表中找到。可以通过map来实现,用运算符的符号string为关键字,而其函数为值。

例:

236b5249a6564341ae5a549d6f777c25.png

9da676eedba54149a6e96ce9579797c3.png

88d621461cb64149a0aef21b546c45df.png

而lambda不是函数,而是一个类类型。但我们可以使用function新标准库来解决这个问题。 

ab1980339755463094f21b35727745b3.png

 标准库function为一个模板,必须提供额外的信息即为该function类型能够表示的对象的调用形式。function<int (int,int)>表示接受两个int实参,返回int的可调用对象。

7197edeb9dec426dbd0b48e40cde31a3.png

这样就可以添加所有为此调用形式的调用对象了, 

dfbda3d3cc004ad08fef14375bb5c1b0.png

b904b54146ab4ea3bd74aa5b50398da7.png

而function是无法区分重载函数的,会有二义性。故不能直接将函数名作为参数,而是要存储函数指针。

8479d5cff77441978cf7213ee8a2b42a.png

35f90ba467f44a1eb151061dfd8996b8.png

707ed875c8f94e30b6e2b32facf6757f.png

重载,类型转换与运算符:

类具有隐式将实参类型转换成类类型的隐式转换,要求其构造函数只接受一个实参,即建立了这个实参向类转换的方式。这种转换可以用于直接初始化和拷贝初始化中,一定要是初始化,且只允许一次的隐式类型转换。但是我们是可以在一次内置类型的转换中添加一次用户自定义的类型转换。

class S

{

int a;

public:

S(int b):a(n){}

}

S x = 2;//由int转换成S,在赋值给x

S  x =2.4;//此时double先内置类型转换成int,后面可以衔接用户自定义的类型变换。double->int->S再向x赋值。

类类型转换运算符:

而我们还定义了由类类型向其他类型转换的方式,即为重载类型转换运算符:

operator type()const;

该类型转换运算符没有返回类型(或者隐式的定义了返回类型为要转换的type),没有形参,一定为成员函数,type是一种类型(即类转换成的类型),类型转换运算符可以面向任何的可以作为函数返回值的类型进行定义。不能转换成数组或者函数类型,但可以转换成指针或引用类型。

87a02396a7b547509a3a1a3f68df4a09.png

 39d48d04860a4c7790329d0bc0206d5a.png

 429f62e54dd6413b93ab74d003f479d2.png

 0ca61a044dc748e4940d4bbd66b4070e.png

 避免滥用,只有在一一对应的关系下使用才不会歧义。

类型转换符可能会带来意外的结果:

大部分情况下的类向其他类型的转换可能不会让人理解,通常都是将其类转换成bool类型用于判断。但是在早期的c++中,因为bool类型是算术类型,故可以被用到任何算术的表达式中进行转换。特别是当istream有向bool转换的方式时,以下的表达式就是将被允许.

int a=27;

cin<<a;

虽然cin没有定义<<函数,但是有向bool类型转换的隐式方式,所以会将cin转换成bool并将其向左移位27位,显然是错误的用法,但是允许编译通过。

显式的类型转换运算符(c++11explict):

为了避免这种用法,我们可以不允许隐式的类型转换,即像在构造函数中添加关键字一样,加上explict限定字。

e84a145ccaa84759b399e1735afa7e39.png

 6b5dfaf610984d34b1acb9a4f2de2df9.png

 单与explict构造函数不同,在一些情况下会这种显式的类型转换会被隐式调用。就是在用作条件时,即ifelse,for的条件,do条件部分,,while,?:,逻辑非,逻辑或,逻辑与。

举例(istream)类类型转换为bool:

当我们使用流对象时,流对象本身就定义了operator bool,用于转换成bool类型。

while(cin>>a);(先读入数据到a,然后对cin进行隐式(或者是显式转换的隐式使用,用于判断)转换成bool,如果cin的状态是good,则判断返回真,否则为假。而又因为基本都用于判断(会让explict定义的显式转换来隐式调用),所以基本用关键字explict来限定。

避免二义性的类型转换:


我们可以定义多个类向不同类型的转换,但是必须保证类转换到目标类型只存在唯一的一种转换方式。有两种情况:1.这两种类提供了相同的类型转换,类A提供向类B转换的途径,而类B也提供转换类A的途径。2.一个类定义了多种转换规则,而这些涉及的类型可以通过其他类型转换联系到一起,类似于算术运算符。所以最好只定义一个转换成算术运算符的规则。

4e00a4806da64b428ca1a7d179885f33.png

0d6ea34f010a42d08c4a72cd6edb7424.png

b8447b9dce914a82a362273174e84f7a.png

解决这种错误可以显示说明调用的是那个类来使用构造函数或是类型转换运算符,但我们不能通过强制类型转换来解决,因为其本身也面临着二义性。

 b0932449172147deae3fb21d9106d942.png

还有类的转换源或者转换对象可以相互转换,也会产生二义性的问题。 原因是上述的f2和a2他们的标准类型转换的级别相同。228da79cd98b415790e3cc82c047921e.png

 而当我们使用自己的类型转换时包括标准类型的转换,则标准类型转换将决定编译器选择最优的。

当我们使用两个用户定义的类型转换时,如果转换函数之前或之后存在标准类型转换,则标准类型转换来决定最佳匹配是哪个。

重载函数与转换构造函数:


​​​​​​​如果一个重载函数定义了不同类型的形参类型,而这些类型都定义了同样的转换构造函数,会产生二义性。

struct C{
    C(int);
};
struct D{
    D(int);
};
void manip(const C&);
void manip(const D&);
manip(10);

这时有二义性,10都能转换成C或者D,没有优先级区分,编译器不知道优先调用哪一个。而我们可以用显式构造来消除二义性:

manip(C(10));

重载函数与用户定义的类型转换:


如果调用重载函数时,两个用户定义的类型转换都提供了可行的匹配时,则我们会认为这些类型转换一样好。不会考虑任何可能出现的标准类型转换的级别。即使其中一个不用类型转换能够精确的匹配。

struct{
    C(int);
};
struct D{
    D(int);
};
struct E{
    E(double);
};
void manip(const C&);
//void manip(const D&);
void manip(const E&);
manip(10);//二义性错误,此时E和C的转换构造函数都同等于作用,无关标准类型转换,即double转成int这一过程,会同时考虑manop(c(10))还是manip(E(double(10))

只有当重载函数是对于同一个类定义的类型转换函数匹配时,才会考虑到其中出现的标准类型转换。

函数匹配与重载运算符:


重载的运算符也是重载函数,因此同时适用于函数的匹配规则。但是当运算符函数出现在表达式中时,候选函数集的规模要比我们使用调用运算符调用函数时更大。

a sym b    

a.operatorsym(b);//a有一个operatorsym的成员函数
operatorsym(a,b);//普通函数

我们不能通过调用的形式来区分当前调用的时成员函数还是非成员函数。当我们使用重载运算符作用于类类型对象时,候选函数中包含该运算符的普通非成员版本和内置版本。除此之外,如果左侧运算对象也是类类型,则定义在其中的运算符的重载版本也在候选函数中。

这是因为当我们调用一个正常的命名的函数时,有该名字的成员函数和非成员函数不会彼此重载。我们对于调用命名函数的语法对于成员函数和非成员函数是不同的。当通过类类型的对象(或该对象的引用和指针时)进行函数调用指只会考虑其成员函数。而当我们在表达式中使用重载运算符时,则没有区分的语法来判断正在使用的时成员函数还是非成员函数,二者都要考虑在内。

class S{
    int display();
    int operator +(S &);
};
    daiplay(S &);
    
int main(){
    S p1,p2;
    display(p1);//明显的正常函数调用,不会考虑到类中的函数
    p1.display();//表明是类成员函数调用,只会考虑到类成员函数
    
    p1+p2;//无法区分
    





return 0;
}

举例:
 

class S{
    friend S operator +(const S&,const S&);
public:
    S(int=0); //转换源是int的类型转换
    operator int() const//转换目标为int的类型转换
    {return val;}
private:
    std::size_t val;

S s1,s1;
S s3= s1+s2; //使用重载的operator+
int i = s3+0;//二义性错误,可以将s3转换成int,执行加法运算,或者将0转换成S,使用S类中的+;

如果我们对同一个类即提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则会遇到重载运算符与内置运算符的二义性问题。

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

C++primer(第五版)---14章(重载运算与类型转换) 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • std::bind 重载解析

    下面的代码工作正常 include
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • C++——大数加法

    大数加法 即运算的数据可能很大 int long long long无法存放 存在字符串中 但是加法的运算规则还是10进制 对于两个字符串 首先判断两者的长度 我们将字符串s设置为较长的字符串 方便后面的运算 也可以将t设置为较长的 从低位
  • 一文2000字详细介绍Android APP 常见概念与 adb 命令

    01 背景 因 team 正在推进 APP 自动化测试 那么主要业务是 IoT 相关的产品 既然是 APP 自动化测试 那么 Android APP 相关的一些概念与知识就很关键了 在之前遇到相关的问题都是现查现用 对于一些常用的概念和命令
  • 【Redis】常见数据结构及命令

    Redis常见命令 Redis数据结构介绍 Redis是一个key value的数据库 key一般是String类型 但是value的类型有很多种 Redis 通用命令 通用指令是部分数据类型的 都可以使用的指令 常见的有 KEYS 查看符
  • C++实现英语词典

    需要的东西 1 一个词典的txt文件 2 创建map容器 map
  • 最小二乘支持向量机”在学习偏微分方程 (PDE) 解方面的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 本代码说明了 最小二乘支持向量机 在学习偏
  • 多媒体(视频容量计算)-软件设计(四十二)

    真题详解 有向图 软件设计 四十一 https blog csdn net ke1ying article details 129942490 一 音频概念 声音带宽 人耳 20Hz 20KHz 说话300 3400Hz 小于20Hz次声波
  • 上海链节科技:什么是企业链改?

    如何定义链改 链改 即用区块链中的部分技术原理和机制来改造业务系统中特定的部分 以创造更高效 更有公信力的系统 甚至还包括利用区块链上的各类积分 Token通证 来重新分配业务系统进而间接的改进业务系统背后的生产关系 传统基本结构的公司 通
  • 从IDataReaderHelper中读取数据实体

    using System using System Collections Generic using System Linq using System Text using System Data using System Reflect
  • 截取oracle字符串中的数字(转载)

    截取oracle字符串中的数字 云淡风轻博客 博客园 cnblogs com 方法一 如果Oracle版本不是太低的话 使用 正则表达式函数 REGEXP SUBSTR 处理 REGEXP SUBSTR有5个参数 分别是 第一个是输入的字符
  • GMAPPING的参数设置

    二 运行gmapping 我总结了运行gmapping的两种方法 1 基于命令行 rosrun gmapping slam gmapping scan scan delta 0 1 maxUrange 4 99 xmin 5 0 ymin
  • python必背代码-Python高手必修课:如何让 Python 代码更易读,推荐收藏

    阅读本文大概需要 10 分钟 我们知道 Python 是一种动态语言 在声明一个变量时我们不需要显式地声明它的类型 例如下面的例子 a 2 print 1 a 1 a 运行结果 1 a 3 这里我们首先声明了一个变量 a 并将其赋值为了 2
  • 【深入理解C++】string

    文章目录 1 概述 2 string的定义与初始化 3 string的赋值 4 string的读写 5 string的长度 6 string的遍历 6 1 运算符 6 2 at 6 3 迭代器 6 4 范围for 7 string 与 ch
  • Excel开发(VBA)— 快速定位最后有记录的行

    有时候 在进行Excel开发时 需要知道某列的最后一行的行号 Excel也提供了相关功能 Range End属性 Dim strCell As String Dim nLastUseRow As Long Dim nLastRcdRow A
  • Vue深入响应性原理

    深入响应性原理 参考资料 响应性 深入响应性原理 什么是响应性 Vue如何知道哪些代码在执行 Vue如何跟踪变化 被代理的对象 Proxy vs 原始标识 如何让渲染响应变化 响应性基础 声明响应式状态 创建独立的响应式值作为refs Re
  • 数据挖掘之关联分析(实验展示以及源代码)

    数据挖掘之关联分析 算法实现 Apriori算法和FP growth 算法 源代码 简单描述下 关联分析概念 关联分析概念主要参考下面的博文 原文 https blog csdn net qq 40587575 article detail
  • idea如何设置自动换行(亲测)

    方法 步骤 第一步 点击idea中的file 然后点击setting 第二步 在编辑中选择代码风格 然后点击java 第三步 在如图所示的栏目中点击Ensure 开头的选项 第四步 选择好以后直接点击apply应用 使其生效 第五步 返回代
  • Python界面 可视化开发(python3+PyQt5+Qt Designer)

    前言 以前制作一个Python窗体界面 我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的 今天朋友问我有没有Python窗体的设计工具 用鼠标拖拖 就能完成窗体设计 我查了查相关资料 果然有一款好用的工具 Qt Designe
  • Q3.Numpy_统计分析-排序、去重和重复、搜索和计数函数

    Part 1 排序函数 numpy排序方式主要分为直接排序和间接排序两种 直接排序是指对数值直接进行排序 间接排序是指根据一个或多个键对数据集进行排序 在numpy中 直接排序常用sort 函数 间接排序常用argsort 函数和lexso
  • 官方YOLOV5的torch模型->ONNX模型->RKNN模型

    1 环境配置 1 1 RKNN Toolkit2的环境配置 下载RKNN Toolkit2 git clone https github com rockchip linux rknn toolkit2 git 打开一个终端命令行窗口 安装
  • C++primer(第五版)---14章(重载运算与类型转换)

    目录 编辑 重载运算符的基本概念 调用重载运算符 而有些运算符不应该被重载 应该保持与内置类型一致的含义 是否成员成员函数 重载io lt lt 和 gt gt 运算符 重载 lt lt 运算符 重载 gt gt 运算符 算术运算符 关系运