C++ Primer Plus (6th) Chap12 类和动态内存分配 摘录
通常,最好是在程序运行时(而不是编译时)确定诸如使用多少内存等问题。对于在对象中保存姓名来说,通常C++的做法是,在类构造函数使用new运算符在程序运行时分配所需的内存。
12.1 动态内存和类
C++分配内存时采取的部分策略与此相同,让程序在运行时决定内存分配,而不是在编译时决定。
12.1.1 复习示例和静态类成员
// stringbad.h
#include <iostream>
#ifndef STRINGBAD_H_
#define STRINGBAD_Hclass StringBad
{
private:char* str;int len;static int num_strings;
public:StringBad(const char* s);StringBad();~StringBad();
// friend functionfriend std::ostreaming& operator <<(std::ostreaming os, const StringBad& st);
};#endif
对于此声明,需要注意两点。首先,它使用char*指针(而不是char数组)来表示姓名。意味着类声明没有为字符串本身分配存储空间,而是在构造函数中使用new来为字符串分配空间。这避免了在类声明中预先定义字符串的长度。其次,将num_strings成员声明为静态存储类。静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本。也就是说,类的所有对象共享同一个静态成员。这对于所有类对象都具有相同值的类私有数据是非常方便的。
// string.cpp -- StringBad class methods
#include <cstring>
#include "stringbad.h"
using std::cout;// initializing static class member
int StringBad::num_strings = 0;// class methods
// construct StringBad from C string
StringBad::StringBad(const char* s)
{len = std::strlen(s);str = new char[len + 1]; // 类成员str是一个指针,因此构造函数必须提供内存来存储str。std::strcpy(str, s); // 若使用str = s,则只是将s地址赋给了str,而并没有保存s指向的内容。num_strings += 1;
}StringBad::~StringBad()
{--num_strings;delete[] str; // 构造函数使用了new char[]。
}
请注意,不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存。对于静态成员,可以在类声明之外使用单独的语句来进行初始化,这是因为静态类成员是单独存储的,而不是对象的组成部分。请注意,初始化语句指出了类型,并使用了作用域运算符,但没有使用关键字static。初始化是在方法文件中,而不是在类声明文件中进行的,这是因为类声明位于头文件中,程序可能将头文件包含在其他几个文件中。如果在头文件中进行初始化,将出现多个初始化语句副本,从而引发错误。
注意,静态数据成员在类声明中声明,在包含类方法的文件中初始化。初始化时使用作用域运算符来指出静态成员所属的类。但如果静态类成员是const整数类型或枚举类型,则可以在类声明中初始化。
当StringBad对象过期时,str指针也将过期。但str指向的内存仍被分配,除非使用delete将其释放。删除对象可以释放对象本身占用的内存,但并不能自动释放属于对象成员的指针指向的内存。
在构造函数中使用new来分配的内存时,必须在相应的析构函数中使用delete来释放内存。如果使用new[](包括中括号)来分配内存,则应使用delete[]来释放内存。
12.1.2 特殊成员函数
StringBad类的问题是由特殊成员函数引起的。具体地说,C++自动提供了下面这些成员函数:
1. 默认构造函数, 如果没有定义构造函数;
2. 默认析构函数, 如果没有定义;
3. 复制构造函数, 如果没有定义;
4. 复制运算符, 如果没有定义;
5. 地址运算符, 如果没有定义;
StringBad类中的问题是由隐式复制构造函数和隐式赋值运算符引起的。
隐式地址运算符返回调用对象的地址(即this指针的值)。
C++11 还提供了另外两个特殊成员函数:移动构造函数(move constructor)和移动赋值运算符(move assignment operator)。
1. 默认构造函数
如果没有提供任何构造函数,C++将创建默认构造函数。也就是说,编译器将提供一个不接受任何参数,也不执行任何操作的构造函数例如:
Klunk::Klunk(){}; // implicit default constructor
如果定义了构造函数,C++将不会定义默认构造函数。如果希望在创建对象时不显示地对它进行初始化,则必须显式地定义默认构造函数。这种构造函数没有任何参数,但可以使用它来设置特定的值:
Klunk::Klunk()
{klunt_ct = 0;...
}
带参数的构造函数也可以是默认构造函数,只要所有的参数都有默认值。
Klunk(int n = 0){ klunk_ct = n; }
但是默认构造函数只有有一个,不然引起二义性。
2. 复制构造函数
复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中。类的复制构造函数通常如下;
Class_name(const Class_name& );String::String(const String& st)
{num_strings++;len = st.len;str = new char[len + 1];std::strcpy(str, st.str);
}
对于复制构造函数,需要知道两点:何时调用和有何功能
新建一个对象并将其初始化同类现有对象时,复制构造函数都将被调用。最常见的情况时将新对象显式地初始化为现有的对象。
StringBad motto = {...};// 以下4种声明都调用复制构造函数
StringBad ditto1(motto);
StringBad ditto2 = motto;
StringBad ditto3 = StringBad(motto);
StringBad* ditto4 = new StringBad(motto);
中间两种声明可能会导致使用复制构造函数直接创建ditto2和ditto3,也可以使用复制构造函数生成一个临时对象,然后将临时对象的内容赋给ditto2和ditto3,这取决于具体实现。最后一种声明使用motto初始化一个匿名对象,并将新对象的地址赋给ditto4指针。
每当程序生成了对象副本时,编译器都将使用复制构造函数。具体地说,当函数按值传递对象或函数返回临时对象时,都将使用复制构造函数。记住,按值传递意味着创建原始变量的一个副本。
4. 默认的复制构造函数功能
默认的复制构造函数逐个复制非静态成员(成员复制也叫浅复制),复制的是成员的值。静态成员是属于整个类的,而不是各个对象。
12.1.3 回到StringBad:复制构造函数的哪里出了问题
StringBad sports = {...};
StringBad sailor = sports;
一个问题是静态成员变量计数更新问题。如果类中包含这样的静态成员,即其值将在新对象被创建时发生变化,则应该提供一个显式复制构造函数来处理静态成员更新问题。
另一个问题隐式构造函数是逐非静态成员复制。
当释放sports后,则sailor.str指向的内存也被释放了,这将导致不确定的,甚至有害的后果。因为试图释放内存两次可能导致程序异常终止。
解决类设计中这种问题的方法是进行深度复制(deep copy)。复制构造函数应当复制字符串并将副本的地址赋给str成员,而不仅仅是复制字符串地址。这样每个对象都有自己的字符串,而不是引用另一个对象的字符串。
必须定义复制构造函数的原因在于,一些类成员是使用new初始化的、指向数据的指针,而不是数据本身。
如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针。这被称为深度复制。复制的另一种形式(成员复制或浅复制)只是复制指针值。浅复制仅浅浅地复制指针信息,而不会深入“挖掘”以复制指针引用的结构。
12.1.4 StringBad的其他问题:赋值运算符
Class_name& Class_name::operator =(const Class_name&);
1.赋值运算符的功能以及何时使用它
将已有的对象赋给另一个对象时,将使用重载的赋值运算符:
StringBad headline(...);
StringBad knot;
knot = headline; // 赋值运算符StringBad knot1 = headline; // 复制构造函数
初始化对象时,并不一定调用赋值运算符。knot1初始化的实现可能分两步来实现:使用复制构造函数创建一个临时对象,然后通过赋值将临时对象的值复制到新对象中。
与复制构造函数类似,赋值运算符的隐式实现也对成员进行逐个复制。
2. 赋值问题的出在哪里
问题与隐式复制构造函数相同:数据受损。
3. 解决赋值的问题
解决办法是提供赋值运算符(进行深度复制)定义,其实现与复制构造函数类似。但也有一些区别:
由于目标对象可能引用了以前分配的数据,所以函数应该先使用delete来释放这些数据;
函数应当避免将对象赋给自身;否则,给对象重新赋值,释放内存操作可能删除对象的内容。
函数应当返回一个指向调用对象的引用。
通过返回一个对象,函数可以像常规赋值操作那样,进行连续的赋值。
StringBad& StringBad::operator =(const StringBad& st)
{if (this == &st)return *this;delete[] str;len = str.len;str = new char[len + 1];std::strcpy(str, st.str);return *this;
}
如果不是自我赋值,在不首先使用delete运算符,则上述字符串将保留在内存中。由于程序中不在包含该字符串的指针,因此这些内存将被浪费掉。
12.2 改进后的String类
12.2.1 修订后的默认构造函数
String::String()
{len = 0;str = new char[1];str[0] = '\0';
}
您可能会问,会什么使用new char[1], 而不是new char? 上面两种方式分配的内存量相同,区别在于前者与类析构函数兼容,而后者不兼容。析构函数中包含以下代码delete[] str。
C++11 引入了新关键字nullptr,用于表示空指针。
12.2.2 比较成员函数
要实现字符串比较函数,最简单的方法是使用保准的strcmp()函数,如果依照字母顺序,第一个参数位于第二个参数之前,则该函数返回一个负值;如果两个字符串相同,则返回0;如果第一个参数位于之后,则返回一个正值。
bool operator <(const String& st1, const String& st1)
{return std::strcmp(st1.str, st2.str) < 0;}
12.2.3 使用中括号表示法访问
对于中括号运算符,一个操作数位于第一个中括号前面,另一个操作数位于两个中括号之间。
const char& String::operator [](int i) cosnt return str[i];
在重载时,C++将区分常量和非常量函数的特征标。
12.2.4 静态类成员函数
可以将成员函数声明为静态(函数声明必须包括关键字static,但如果函数定义是独立的,则其定义不需包含static关键字)。
静态类成员函数有两个特点:首先,不能通过对象调用静态类成员函数;实际上,静态类成员函数不能使用this指针。如果静态成员函数是在公有部分声明的,则可以使用类名和作用域解析运算符来调用它。例如
// 在类中声明静态类成员函数HowMany
static int HowMany() {return num_strings;}// 调用它的方式如下
int count = String::HowMant();
由于静态成员函数不与特定的对象相关联,因此只能使用静态数据成员。例如,静态类成员函数能访问静态类成员num_strings,但不能访问str和len。
12.3 在构造函数中使用new时应注意的事项
使用new初始化对象的指针成员时必须特别小心,具体地说:
如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete。
new和delete必须相互兼容,new对应delete,new[]对应delete[]。
如果有多个构造函数,则必须以相同地方式使用new,要么都带中括号,要么都不带。因为只有一个析构函数,所有构造函数都必须与它们兼容。
应定义一个复制构造函数,通过深度复制将一个对象初始化为另一个对象。具体地说,复制构造函数应该分配足够的空间来存储复制的数据,并复制数据,而不仅仅是数据的地址。另外,还应该更新所有受到影响的静态类成员。
应当定义一个赋值运算符,通过深度复制将一个对象复制给另一个对象。具体地说,应检查自我赋值情况。
12.4 有关返回对象的说明
当成员函数或独立的函数返回对象时,有几种返回方式可供选择。可以返回指向对象的引用、指向对象的const引用或const对象。
12.4.1 返回值const对象的引用
如果函数返回(通过调用对象的方法或将对象作为参数)传递给它的对象,可以通过返回引用来提高其效率。
Vector force1(20, 30);
Vector force2(10, 20);
Vector max;
max = Max();const Vector& Max(const Vector& v1, const Vector& v2)
{if(v1.magva;() > v2.magva())return v1;elsereturn v2;
}
这里有三点需要说明:首先,返回对象将调用复制构造函数,而返回引用不会。其次,引用指向的对象应该在调用函数执行时存在。最后,v1与v2都被声明为const引用,因此返回类型必须为const。
12.4.2 返回指向非const对象的引用
两种常见的返回非const对象的情形是,重载赋值运算符=以及重载与cout一起使用的<<运算符。前者是为了提高效率,而后者是必须这样做。因为使用返回类型ostream,将调用ostream类的赋值构造函数,而ostream没有公有的复制构造函数。
12.4.3 返回对象
如果返回对象是被调用函数的局部变量,则不应按引用方式返回它,因为在被调用函数执行完毕时,局部对象将调用其析构函数。因此,当控制权回到调用函数时,引用指向的对象将不再存在。通常,被重载的算术运算符属于此类。在这情况下,存在调用复制构造函数创建被返回的对象的开销,然而,这是无法避免的。
12.4.4 返回const对象
避免程序员的某些误操作,将返回类型声明为const对象。
总之,如果方法或函数返回局部对象,则应返回对象,而不是指向对象的引用。在这种情况下,将使用复制构造函数来生成返回的对象。如果方法要返回一个没有公有复制构造函数的类的对象时,它必须返回一个指向这种对象的引用、最后,若即可返回对象or指向对象的引用时,优先返回引用。
12.5 使用指向对象的指针
通常,如果Class_name是类,value的类型为Type_name。则下面的语句:
Class_name* pclass = new Class_name(value);
将调用如下构造函数Class_name(Type_name);这里可能还有一些琐碎的转换,例如:
Class_name(const Type_name&)。另外,如果不存在二义性,则将发生由原型匹配导致的转换。
12.5.1 在谈new和delete
在以下情况下,析构函数将被调用:
如果对象是动态变量,则当执行完定义该对象的程序块时,将调用该对象的析构函数。
如果对象时静态变量(外部、静态、静态外部或来自名称空间),则在程序结束时将调用对象的析构函数、
如果对象是用new创建的,则仅当您显式使用delete删除对象时,其析构函数才会被调用。
15.5.2 指针和对象小结
使用对象指针时,需要注意几点:
// 使用常规表示法声明指向对象的指针
String* glamour;// 可以将指针指向已有的对象
String* first = &sayings[0];// 可以使用new来初始化指针
String* favorite = new String(sayings[chioce]);// 使用默认构造函数
String* gleep = new String;// 使用复制构造函数
String* glop = new String("my");// 使用->运算符通过指针访问类方法
shorter->length();
12.5.3 再谈定位new运算符
// 下面的代码有问题!!!!
JustTesting*, pc1, * pc2, * pc3, * pc4;
pc1 = new (buffer) JsutTesting;
pc2 = new JustTesting("Heap1", 20);
pc3 = new (buffer) JustTesting("Bad Idea", 6);
pc4 = new JustTesting("Heap2", 10);
使用定位new运算符存在两个问题。首先,在创建第二个对象时,定位new运算符使用一个新对象来覆盖第一个对象的内存单元。显然,如果类动态地为其成员分配内存,这将引发问题。其次,及那个delete应用于pc2和pc4时,将自动调用pc2和pc4指向的对象调用析构函数;然而,将delete[]应用于buffer时,不会为使用new运算符创建的对象调用析构函数。
程序员必须负责管用定位new运算符用从中使用的缓冲区内存单元。要使用不同的内存单元,程序员需要提供两个位于缓冲区的不同地址,并确保这两个内存单元不重叠。例如,可以这样做;
pc1 = new (buffer) JustTesing;
pc3 = new (buffer + sizeof(JustTesing)) JustTesing("Better Idera", 6);
第二个教训是,如果使用定位new运算符来为对象分配内存,必须确保其析构函数被调用。对于堆中的数据:可以按以下方式处理:
delete pc2;
delete不能与定位new匹配。这种解决方案是显式地为使用定位new运算符创建的对象调用析构函数。显式地调用析构函数时,必须指定要销毁的对象。
delete pc1; // No!
delete pc3; // No!pc1->~JustTesting(); // OK!
pc3->~JustTesting(); // OK!delete[] buffer;
对于使用定位运算符创建的对象,应以与创建顺序相反的顺序进行删除。原因在于,晚创建的对象可能依赖于早创建的对象。另外,仅当所有对象都被销毁后,才能释放用于存储这些对象的缓冲区。
12.6 复习各种技术
12.6.1 重载<<运算符
请定义下面的友元运算符函数:
ostream& operator<<(ostreeam& os, const c_name& obj)
{os << ...return os;
}
12.6.2 转换函数
要将单个值转换为类类型,需要创建原型如下的类构造函数:
c_name(type_name value);
其中c_name是类名,type_name是要转换的类型的名称。
要将类转换为其他类型,需要创建原型如下的类成员函数:
operator type_name();
12.6.3 其构造函数使用new的类
对于指向的内存是由new分配的所有类成员,都应在类的析构函数中对其使用delete。
如果析构函数通过对指针类成员使用delete来释放内存,则没够构造函数都应当使用new来初始化指针,或将其设置为空指针。
构造函数要么使用new[], 要么使用new,而不能混用。因为析构函数只有一个。
应定义一个分配内存(而不是将指针指向已有内存)的复制构造函数。这样程序将类对象初始化为另一个类对象。其函数原型如下:
className(const className&);
应定义一个重载赋值运算符的类成员函数吗其定义如下:
c_name& c_name::operator =(const c_name& cn)
{if (this == &cn)return *this;delete[] c_pointer;// calculate sizec_pointer = new type_name[size];// copy cn.data to c_pointer point to datareturn *this;
}
12.7 设计类
先列出类的特征;
设计好数据的表示方法后,编写类方法;
确定接口后,实现它;
在类中声明的结构,类或枚举量是被嵌套在类中,其作用域为整个类。这种声明不会创建数据对象,而只是指定了可以在类中使用的类型。如果声明是在类的私有部分进行的,则只能在这个类使用被声明的类型;如果是在公有部分进行的,则可以从类的外部通过作用域解析运算符使用被声明的类型。
构造函数首先给成员数据分配内存。然后,程序流程进入括号中,使用常规的赋值方法将值存储到内存中。但对于const成员数据而言,必须在执行到构造函数体之前,即创建对象时初始化。C++提供了成员初始化列表。成员初始化列表由逗号分隔的初始化列表组成,前面带冒号。通常,初值可以是常量或构造函数的参数列表中的值。
只有构造函数可以使用这种初始化列表语法。对于const类成员和呗声明为引用的类成员,必须使用初始化列表语法。因为const数据和引用都必须在创建时初始化。
Classy::Classy(int n, int m) : mem1(n), mem2(0), mem3(n * m + 2)
{...
}
C++11 类内初始化:
class Classy
{int mem1 = 10;const int mem2 = 20;...
}
在某些情况下,将构造函数声明为私有。
class ClassName
{
private:ClassName();
...}
这样做有两个作用。第一,它避免了本来将自动生成的默认方法定义。第二,因为方法是私有的,所以不能被广泛使用。另外,在定义其对象不允许被复制的类时,也能用的上。
C++11提供了另一个禁用方法的方式--使用delete关键字。
12.8 总结
在类构造函数中,可以使用new为数据分配内存,然后将内存地址赋给类成员。
如果对象包含指针,同时它指向的内存是由new分配的,则释放用于保存对象的内存并不会自动释放对象成员指针指向的内存。因此,在类构造函数使用new来分配内存时,应在类析构函数中使用delete来释放分配的内存。这样,当对象过期时,将自动释放其指针成员指向的内存。
在默认情况下,C++逐个对成员进行初始化和赋值,这意味着被初始化或被赋值的对象的成员将于原始对象完全相同。即两个指针指向同一块内存。当对象都过期后,类的析构函数试图删除同一块内存两次,这是错误的。解决方法是:定义一个特殊的复制构造函数来重新定义初始化,并重载赋值运算符。
对象的存储持续性为自动或外部时,在它不在存在时将自动调用其析构函数。mew和delete应该匹配使用。
C++允许在类中包含结构、类和枚举定义。这些嵌套类型的作用域是整个类。
C++为构造函数提供初始化成员列表。这种语法包括冒号和逗号分隔的初始化列表,被放在构造函数参数的右括号边,函数体的左括号之前。如果数据成员是非静态const成员或引用,则必须使用初始化成员列表方式。C++11 允许新增的类内初始化用于非静态const类型。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- IDEA中servlet编写出现的小问题
response.setContentType("text/html;charsetutf-8"); setContentType会出现两个小问题(1.在跳转页面时打印?????)(2.在跳转页面时跳到下载窗口)1.在响应消息中"text/html;charsetutf-8"的“ ; ”写成“ , ”处理中文乱码问题,浏览器不能识…...
2024/5/3 1:40:19 - Internal Sorting
Θ(n2) Sorting Bubble Sort 从下往上逐渐把最小值浮上来,修改好的放在最上面 template <class Elem, class Comp> void bubsort(Elem A[], int n) {for (int i0; i<n-1; i)for (int jn-1; j>i; j--)if (Comp::lt(A[j], A[j-1]))swap(A, j, j-1); }比…...
2024/5/3 1:40:15 - 一注册就封怎么办解析硬改软改优缺点
一、C语言编程软件推荐 C语言编程软件适于编写系统软件,是学习编程的同学们的必备软件。c语言一种应用非常广泛的编程语言,不仅仅是在软件开发上,而且各类科研都会用到c语言。今天小编给大家汇总下C语言的编程软件。 二、小编汇总的C语言编程…...
2024/5/3 1:40:12 - Java 常见类 I
Object Object类是类层次结构的根类。每个类都使用 Object 作为超类。每个类都直接或者间接的继承自Object类。 Object 中常用方法有: public int hashCode() //返回该对象的哈希码值。 // 注意:哈希值是根据哈希算法计算出来的一个值,这个…...
2024/5/3 1:40:07 - 15.上一次rnn学习的加工【代码详解】
Author: 365JHWZGo Description: 15.上一次rnn学习的加工 Date: 2021/10/30 19:45 FilePath: day11-2.py # 导包 import os import torch import torchvision from torch.autograd import Variable import torch.utils.data as Datatorch.manual_seed(1)# 超参数 BATCH_SIZE 6…...
2024/5/3 1:40:03 - 穿越(BFS)
题目描述 亚马逊雨林实在是太大了,小X和他的小弟们进去一会儿就迷路了,然而大雨已经来临,冲刷了一些道路,小X凭借他最后的5%的电量给你发来一条求助信息,希望你帮助他们逃出困境…… 小X给你发来一张nm的地图&#x…...
2024/5/3 1:39:59 - CPU高速缓存(Cache Memory)
文章目录CPU高速缓存多CPU多核缓存架构缓存一致性(Cache coherence)缓存一致性的要求写传播(Write Propagation)事务串行化(Transaction Serialization)一致性机制(Coherence mechanisms&#x…...
2024/5/2 19:17:28 - Vitis HLS 2021.1 Command Prompt make 不是内部或外部命令
打开 Vitis HLS 2021.1 Command Prompt,执行 make 出错: 通过 where gcc 命令得知 gcc 是环境变量中的另一个 gcc,并不是 Vitis HLS 自带的。查看 Vitis HLS 2021.1 Command Prompt 的快捷方式所指向的目标为:F:\Xilinx\Vitis_H…...
2024/5/3 1:39:56 - 138. 复制带随机指针的链表
138. 复制带随机指针的链表题目描述思路分析代码实现题目描述 点这里 思路分析 链表操作练习 把每个节点的复制节点加到对应节点后边,这样可以节省一个哈希表 代码实现 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Nod…...
2024/5/3 1:39:52 - gdut 2021级月赛d题开始快乐的acm生活
怎么说呢?经典的一个结构体排序,但是读题难度对于我这种语文不行的是死死的压制。 题目(链接)不会说很难,是师兄眼中的签到题,答对的人数那么少也是很多人没想到的,虽然我比赛时也没写出来就是…...
2024/5/3 1:39:47 - [Android]app调用系统服务dump讨论
【相关技术讨论群】760816094 在app调用系统服务的dump方法,我们可以参考dumpsys命令的实现,可以通过以下2中方式, 1,获取服务的Ibinder对象,但是一般是获取不到的,因为在app端可以使用的类似PackageManag…...
2024/5/3 1:39:44 - 【报告分享】中国瑜伽行业发展趋势研究报告-艾瑞咨询(附下载)
摘要:中国现代都市快节奏、高强度的工作生活给居民带来身体及心理上的疲劳, 而习练瑜伽则被认为是一种能起到缓解作用的方式方法。未来用户增长层面,未来主要竞争将在二三线城市,品牌需基于用户特征探索不同打法;产品服务层面&…...
2024/5/3 1:39:39 - Java学习-简介
一、Java最早是由SUN公司(已被Oracle收购)的詹姆斯高斯林( James Gosling,高司令,人称Java之父)在上个世纪90年代初开发的一种编程语言。 二、Java介于编译型语言和解释型语言之间 编译型语言:…...
2024/5/3 1:39:35 - 讲解java面向对象与static修饰符使用规则
解释面向对象与面向过程 java是面向对象的编程技术,正是因为这种特点因此java才能大火至今。就像组成汽车的一个个零件,我们要造一辆汽车不用去自己造发动机,造螺丝,造轮胎。只要我们符合标准,这些零件都可以买到…...
2024/5/3 1:39:31 - 哪里能薅到免费的GPU可用?
教你如何免费白嫖GPU? 对于机器学习和深度学习,自学者最难的是搭建好了网络却没有合适的平台进行训练。一种方法是买GPU,但是一块好的GPU动辄上万,实在是心有余而力不足。另一种流行方法是租用GPU,市场上GPU的租用商家…...
2024/5/3 1:39:27 - 使用bat命令修改和删除指定文件
常用bat脚本命令 以后会不断的更新,增加更多的实用功能 修改文件 修改文件后缀名(同级目录下,将.png修改成.jpg) ren *.png *.jpg删除文件 删除同级目录下123.txt del 123.txt删除同级目录及子目录下的所有123.txt文件 del /…...
2024/5/3 1:39:23 - 2020年京东Java研发岗社招面经(面试经历+真题总结,java编程教程视频下载
索引是什么概念有什么作用? MySQL里主要有哪些索引结构?哈希索引和B树索引比较? 说说Java线程池的原理?线程池有哪些?线程池工厂有哪些线程池类型,及其线程池参数是什么? hashmap原理&#x…...
2024/5/3 1:39:20 - 字符串处理技巧总结三
字符串format方法-嵌套格式化 补充1 formaat中的一对多的形式,替代多个不同的值只需要写一个参数就可以 #from模块名称,import一个实际的对象,功能(函数) from math import pi print(pi) #先将pi包留两位小数 x"…...
2024/5/3 1:39:15 - js---3 javascript常用对象(String)
前端入门笔记之js(11) String 类定义了大量操作字符串的方法,例如从字符串中提取字符或子串,或者检索字符或子串。 需要注意的是,JavaScript 的字符串是不可变的(immutable),Strin…...
2024/5/3 1:39:11 - 【ONE·C || 解题时遇到的一些代码收集(一)】
总言 比较巧妙的思路,对初学者的我来说值得学习。 总之就是自己见得代码少,想得少,写得也少。这些代码给人一种耳目一新的感觉。 会慢慢学习和补充。 文章目录总言一、关于反向输出数字1)、反向输出四位数二、关于倍数1&a…...
2024/5/3 1:39:08
最新文章
- 练习题(2024/5/5)
1左叶子之和 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24示例 2: 输入: root [1] 输…...
2024/5/6 21:12:32 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/6 9:38:23 - 探索进程控制第一弹(进程终止、进程等待)
文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么?进程终止的情况代码跑完,结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…...
2024/5/5 1:11:34 - 解决npm install安装node-sass包容易失败的问题
具体问题如下: npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: XXX3.4.0 npm ERR! Found: webpack5.31.2 npm ERR! node_modules/webpack npm ERR! peer webpack”^4.0.0 || ^5.0.0″ from html-…...
2024/5/6 13:31:08 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/6 9:21:00 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57