解码常对象与运算符重载

news/2025/12/7 20:38:19/文章来源:https://www.cnblogs.com/YouEmbedded/p/19318788

常对象与常对象成员

常对象

定义

const 修饰的类对象称为常对象,核心是对象的所有数据成员具备只读属性,且必须在定义时完成初始化。有两种等价的定义格式:

const 类名 对象名(初始化参数);  // 标准格式
类名 const 对象名(初始化参数);  // 等价格式

核心特性

  • 必须初始化:定义时需通过类的构造函数完成初始化,不能后续赋值;
  • 数据不可变:所有非 mutable 数据成员变为只读,无法通过常对象修改;
    • mutable 是 C++ 专属关键字,仅用于修饰类的非静态数据成员,核心作用是豁免 const 的只读限制
  • 调用限制:只能调用类的 const 成员函数(避免函数修改数据),无法调用非常成员函数。

示例代码

#include <iostream>
using namespace std;class Cube {
public:int A, B;  // 普通数据成员/*** @brief 默认构造函数,初始化Cube对象的A和B* @return 无返回值(构造函数无返回类型)* @note 常对象若使用默认构造,也需确保数据成员被初始化*/Cube() : A(11), B(22) {cout << "默认构造函数执行" << endl;}/*** @brief 参数化构造函数,自定义初始化Cube对象的A和B* @param a 初始化数据成员A的整数值* @param b 初始化数据成员B的整数值* @return 无返回值(构造函数无返回类型)* @note 常对象必须通过构造函数完成初始化,此为最常用方式*/Cube(int a, int b) : A(a), B(b) {cout << "参数化构造函数执行" << endl;}/*** @brief 常成员函数,展示Cube对象的A和B值* @return 无返回值* @note const修饰表示该函数不修改对象数据,仅读取,可被常对象调用*/void show() const {cout << "A=" << A << ", B=" << B << endl;// A = 100;  // 错误:常成员函数不能修改数据成员}/*** @brief 非常成员函数,尝试修改数据成员* @return 无返回值* @note 常对象无法调用此函数,仅非常对象可调用*/void modify(int a, int b) {A = a;B = b;}
};int main() {// 正确:常对象通过参数化构造初始化const Cube obj(10, 20);// obj.A = 30;  // 错误:常对象的Data成员只读,无法修改// obj.modify(5,6);  // 错误:常对象不能调用非常成员函数obj.show();  // 正确:常对象可调用常成员函数// 非常对象:可调用常/非常成员函数Cube obj2;obj2.modify(33, 44);  // 调用非常成员函数修改数据obj2.show();          // 调用常成员函数展示数据return 0;
}

常对象成员

常对象成员分为常数据成员常成员函数,是类中限制数据修改、保证代码健壮性的核心机制。

常数据成员

定义

const 修饰的类数据成员,代表该成员在对象生命周期内不可修改

核心规则

必须通过构造函数的初始化列表初始化,不能在构造函数体内部赋值(构造函数体执行时,数据成员已完成初始化,const 成员无法二次赋值)。

示例代码

#include <iostream>
using namespace std;class Test {
private:/*** @brief 常数据成员,代表对象的唯一标识,生命周期内不可修改* @note 必须通过构造函数初始化列表赋值,无法在构造函数体修改*/const int ID;public:/*** @brief 构造函数,初始化常数据成员ID* @param id 初始化ID的整数值* @return 无返回值(构造函数无返回类型)* @note 常数据成员ID必须放在初始化列表中初始化,此为唯一合法方式*/Test(int id) : ID(id) {// ID = id;  // 错误:构造函数体中无法给const成员赋值}/*** @brief 常成员函数,获取常数据成员ID的值* @return int 返回ID的整数值* @note 仅读取数据,不修改,符合常成员函数规则*/int getID() const {return ID;}
};int main() {Test t1(1001);  // 正确:初始化常数据成员ID为1001cout << "ID: " << t1.getID() << endl;  // 输出:ID: 1001// Test t2;  // 错误:默认构造函数未初始化const成员IDreturn 0;
}

常成员函数

定义

函数声明末尾加 const 修饰的成员函数,本质是 “承诺该函数不会修改对象的非 mutable 数据成员”。

核心规则

  • 不能修改对象的非 mutable 数据成员;
  • 不能调用类中的非常成员函数(避免间接修改数据),但非常成员函数可调用常成员函数;
  • 常对象只能调用常成员函数,非常对象可调用常 / 非常成员函数;
  • const 可参与函数重载(区分常对象 / 非常对象的调用)。

示例代码

#include <iostream>
using namespace std;class Account {
private:double balance;  // 账户余额(普通数据成员)public:/*** @brief 构造函数,初始化账户余额* @param bal 初始余额的浮点数值* @return 无返回值(构造函数无返回类型)*/Account(double bal) : balance(bal) {}/*** @brief 常成员函数,获取账户余额* @return double 返回当前账户余额* @note const修饰,承诺不修改balance,可被常对象调用*/double getBalance() const {// balance = 0;  // 错误:常成员函数不能修改数据成员return balance;}/*** @brief 非常成员函数,修改账户余额* @param bal 新的账户余额值* @return 无返回值* @note 仅非常对象可调用,可调用常成员函数*/void setBalance(double bal) {balance = bal;cout << "新余额:" << getBalance() << endl;  // 调用常成员函数}
};// 常成员函数重载示例
class Demo {
public:/*** @brief 非常版本的func函数,供非常对象调用* @return 无返回值*/void func() {cout << "普通版本func(非常对象调用)" << endl;}/*** @brief const版本的func函数,供常对象调用* @return 无返回值* @note const修饰,与普通版本构成重载,编译器根据对象类型匹配*/void func() const {cout << "const版本func(常对象调用)" << endl;}
};int main() {// 常对象调用常成员函数const Account acc1(1000.5);cout << "常对象账户余额:" << acc1.getBalance() << endl;// acc1.setBalance(2000);  // 错误:常对象不能调用非常成员函数// 非常对象调用常/非常成员函数Account acc2(500);acc2.setBalance(1500);  // 调用非常成员函数cout << "非常对象账户余额:" << acc2.getBalance() << endl;  // 调用常成员函数// 常成员函数重载测试Demo d1;         // 非常对象const Demo d2;   // 常对象d1.func();       // 匹配普通版本:输出"普通版本func(非常对象调用)"d2.func();       // 匹配const版本:输出"const版本func(常对象调用)"return 0;
}

运算符重载

基本概念

本质

运算符重载是特殊的函数重载,目的是让自定义类对象能像内置类型(int/float 等)一样使用运算符(如 +/>/= 等)。

语法格式

返回类型 operator运算符符号(参数列表);

核心限制(必须遵守)

  • 不能改变原运算符的优先级(如 + 始终低于 );
  • 不能改变原运算符的结合性(如 = 是右结合,+ 是左结合);
  • 不能使用默认参数(运算符操作数个数固定,默认参数会破坏逻辑);
  • 不能改变原运算符的操作数个数(如 + 是双目运算符,重载后仍需两个操作数);
  • 不能改变运算符的语义(如 + 不能实现减法逻辑);
  • 可重载用于:自定义类对象之间、自定义类对象与内置类型之间;
  • 不可重载的运算符. (成员访问)、.*(指向成员的指针访问)、::(作用域解析)、?:(三目条件)、sizeof(大小计算)。

典型运算符的实现方式

运算符重载主要有三种实现方式:成员函数友元函数普通函数,不同运算符适配不同方式(如 = 只能用成员函数)。

算术运算符(以 + 为例)

方式 1:成员函数实现

#include <iostream>
using namespace std;class Vector {
private:int x, y;  // 向量的x、y分量public:/*** @brief 构造函数,初始化向量的x、y分量* @param x 向量x分量的整数值* @param y 向量y分量的整数值* @return 无返回值(构造函数无返回类型)*/Vector(int x = 0, int y = 0) : x(x), y(y) {}/*** @brief 成员函数重载+运算符,实现两个向量相加* @param v 右操作数(待相加的另一个Vector对象)*          const:避免修改传入的对象;引用:避免拷贝,提升效率* @return Vector 返回两个向量相加后的新Vector对象* @note 成员函数隐含this指针(指向左操作数),因此仅需一个显式参数*/Vector operator+(const Vector& v) const {// this->x 是左操作数的x,v.x是右操作数的x,相加后构造新对象返回return Vector(this->x + v.x, this->y + v.y);}/*** @brief 常成员函数,展示向量的x、y分量* @return 无返回值*/void show() const {cout << "Vector(" << x << ", " << y << ")" << endl;}
};int main() {Vector v1(1, 2), v2(3, 4);Vector v3 = v1 + v2;  // 等价于v1.operator+(v2)v3.show();  // 输出:Vector(4, 6)return 0;
}

方式 2:友元函数实现

#include <iostream>
using namespace std;class Vector {
private:int x, y;  // 私有分量,需友元函数访问/*** @brief 友元函数重载+运算符,实现两个向量相加* @param v1 左操作数(第一个Vector对象)*          const:避免修改;引用:避免拷贝* @param v2 右操作数(第二个Vector对象)*          const:避免修改;引用:避免拷贝* @return Vector 返回相加后的新Vector对象* @note 友元函数无this指针,需显式传入两个操作数,可直接访问私有成员*/friend Vector operator+(const Vector& v1, const Vector& v2);public:Vector(int x = 0, int y = 0) : x(x), y(y) {}void show() const {cout << "Vector(" << x << ", " << y << ")" << endl;}
};// 友元函数的实现(类外定义,无需加Vector::)
Vector operator+(const Vector& v1, const Vector& v2) {return Vector(v1.x + v2.x, v1.y + v2.y);
}int main() {Vector v1(1, 2), v2(3, 4);Vector v3 = v1 + v2;  // 等价于operator+(v1, v2)v3.show();  // 输出:Vector(4, 6)return 0;
}

方式 3:普通函数实现

#include <iostream>
using namespace std;class Vector {
public:int x, y;  // 需公开数据成员,否则普通函数无法访问Vector(int x = 0, int y = 0) : x(x), y(y) {}void show() const {cout << "Vector(" << x << ", " << y << ")" << endl;}
};/*** @brief 普通函数重载+运算符,实现两个向量相加* @param v1 左操作数(第一个Vector对象)*        const:避免修改;引用:避免拷贝* @param v2 右操作数(第二个Vector对象)*        const:避免修改;引用:避免拷贝* @return Vector 返回相加后的新Vector对象* @note 普通函数无this指针,需两个显式参数,仅能访问类的公有成员*/
Vector operator+(const Vector& v1, const Vector& v2) {return Vector(v1.x + v2.x, v1.y + v2.y);
}int main() {Vector v1(1, 2), v2(3, 4);Vector v3 = v1 + v2;  // 等价于operator+(v1, v2)v3.show();  // 输出:Vector(4, 6)return 0;
}

关系运算符(以 > 为例)

方式 1:成员函数实现

#include <iostream>
using namespace std;class Person {
private:int age;  // 私有年龄成员public:/*** @brief 构造函数,初始化Person的年龄* @param age 年龄整数值* @return 无返回值(构造函数无返回类型)*/Person(int age) : age(age) {}/*** @brief 成员函数重载>运算符,比较两个Person的年龄* @param p 右操作数(待比较的另一个Person对象)*        const:避免修改;引用:避免拷贝* @return bool 比较结果:true表示当前对象年龄更大,false反之* @note 隐含this指针指向左操作数,访问私有成员age无需额外权限*/bool operator>(const Person& p) const {return this->age > p.age;}
};int main() {Person p1(25), p2(20);// 等价于p1.operator>(p2)if (p1 > p2) {cout << "p1年龄更大" << endl;  // 输出此内容}return 0;
}

方式 2:友元函数实现

#include <iostream>
using namespace std;class Person {
private:int age;  // 私有年龄成员/*** @brief 友元函数重载>运算符,比较两个Person的年龄* @param p1 左操作数(第一个Person对象)*        const:避免修改;引用:避免拷贝* @param p2 右操作数(第二个Person对象)*        const:避免修改;引用:避免拷贝* @return bool 比较结果:true表示p1年龄更大,false反之* @note 无this指针,需两个显式参数,可直接访问私有成员age*/friend bool operator>(const Person& p1, const Person& p2);public:Person(int age) : age(age) {}
};// 友元函数实现
bool operator>(const Person& p1, const Person& p2) {return p1.age > p2.age;
}int main() {Person p1(25), p2(20);if (p1 > p2) {  // 等价于operator>(p1, p2)cout << "p1年龄更大" << endl;}return 0;
}

方式 3:普通函数实现

#include <iostream>
using namespace std;class Person {
public:int age;  // 公开年龄成员,供普通函数访问Person(int age) : age(age) {}
};/*** @brief 普通函数重载>运算符,比较两个Person的年龄* @param p1 左操作数(第一个Person对象)*        const:避免修改;引用:避免拷贝* @param p2 右操作数(第二个Person对象)*        const:避免修改;引用:避免拷贝* @return bool 比较结果:true表示p1年龄更大,false反之* @note 仅能访问类的公有成员,无this指针*/
bool operator>(const Person& p1, const Person& p2) {return p1.age > p2.age;
}int main() {Person p1(25), p2(20);if (p1 > p2) {  // 等价于operator>(p1, p2)cout << "p1年龄更大" << endl;}return 0;
}

赋值运算符(=

核心规则

= 只能以成员函数实现(C++ 语法强制规定),且必须实现深拷贝(避免浅拷贝导致的内存泄漏 / 重复释放)。

示例代码(深拷贝版)

#include <iostream>
#include <algorithm>  // 包含std::copy函数using namespace std;class Array {
private:int* data;  // 动态数组指针int size;   // 数组大小public:/*** @brief 默认构造函数,初始化空数组* @return 无返回值(构造函数无返回类型)* @note data初始化为nullptr,size初始化为0,避免野指针*/Array() : data(nullptr), size(0) {cout << "默认构造函数执行" << endl;}/*** @brief 析构函数,释放动态数组内存* @return 无返回值* @note 避免内存泄漏,必须释放data指向的堆内存*/~Array() {delete[] data;cout << "析构函数执行,释放内存" << endl;}/*** @brief 拷贝构造函数,实现深拷贝* @param other 待拷贝的源Array对象*        const:避免修改源对象;引用:避免递归拷贝* @return 无返回值(构造函数无返回类型)* @note 重新分配内存,拷贝源对象的数据,避免浅拷贝导致的内存共享*/Array(const Array& other) : size(other.size) {// 分配新内存data = new int[size];// 拷贝源对象的数据到新内存std::copy(other.data, other.data + size, data);cout << "拷贝构造函数执行(深拷贝)" << endl;}/*** @brief 成员函数重载=运算符,实现深拷贝赋值* @param other 待拷贝的源Array对象*        const:避免修改源对象;引用:避免拷贝,提升效率* @return Array& 返回当前对象的引用,支持连续赋值(如a = b = c)* @note 核心步骤:1. 检查自赋值;2. 释放原有内存;3. 分配新内存;4. 拷贝数据;5. 返回自身引用*/Array& operator=(const Array& other) {// 1. 检查自赋值(避免释放自身内存后拷贝)if (this != &other) {// 2. 释放当前对象的原有内存delete[] data;// 3. 分配新内存,匹配源对象大小size = other.size;data = new int[size];// 4. 拷贝源对象的数据到新内存std::copy(other.data, other.data + size, data);cout << "赋值运算符执行(深拷贝)" << endl;}// 5. 返回自身引用,支持连续赋值return *this;}/*** @brief 初始化数组数据(辅助函数)* @param arr 待拷贝的整型数组* @param s 数组大小* @return 无返回值*/void init(int* arr, int s) {delete[] data;  // 释放原有内存size = s;data = new int[size];std::copy(arr, arr + size, data);}/*** @brief 展示数组内容(辅助函数)* @return 无返回值*/void show() const {for (int i = 0; i < size; ++i) {cout << data[i] << " ";}cout << endl;}
};int main() {int arr1[] = {1, 2, 3};int arr2[] = {4, 5, 6, 7};Array a1, a2;a1.init(arr1, 3);a2.init(arr2, 4);a1 = a2;  // 调用赋值运算符(深拷贝)a1.show();  // 输出:4 5 6 7Array a3 = a2;  // 调用拷贝构造函数(非赋值运算符)a3.show();  // 输出:4 5 6 7return 0;
}

输入输出运算符(<</>>

输出运算符(<<):友元函数实现(推荐)

#include <iostream>
#include <string>
using namespace std;class Person {
private:string name;  // 私有姓名int age;      // 私有年龄/*** @brief 友元函数重载<<运算符,输出Person对象信息* @param os 输出流对象(如cout)*        引用:ostream对象无法拷贝(拷贝构造函数protected),必须传引用* @param p 待输出的Person对象*        const:避免修改;引用:避免拷贝* @return ostream& 返回输出流引用,支持连续输出(如cout << p1 << p2)* @note 无法用成员函数实现(成员函数的this指针会占据左侧操作数位置,而<<左侧需是ostream对象)*/friend ostream& operator<<(ostream& os, const Person& p);public:/*** @brief 构造函数,初始化Person的姓名和年龄* @param name 姓名字符串* @param age 年龄整数值* @return 无返回值(构造函数无返回类型)*/Person(string name, int age) : name(name), age(age) {}
};// 友元函数实现
ostream& operator<<(ostream& os, const Person& p) {os << "姓名:" << p.name << ",年龄:" << p.age;return os;  // 返回流引用,支持连续输出
}int main() {Person p("张三", 25);// 等价于operator<<(cout, p),连续输出cout << p << " | 额外信息" << endl;  // 输出:姓名:张三,年龄:25 | 额外信息return 0;
}

输入运算符(>>):友元函数实现(推荐)

#include <iostream>
#include <string>
using namespace std;class Person {
private:string name;int age;/*** @brief 友元函数重载>>运算符,读取输入到Person对象* @param is 输入流对象(如cin)*        引用:istream对象无法拷贝,必须传引用* @param p 待赋值的Person对象*        引用:需要修改对象的成员,不能加const* @return istream& 返回输入流引用,支持连续输入(如cin >> p1 >> p2)*/friend istream& operator>>(istream& is, Person& p);public:Person() : name(""), age(0) {}void show() const {cout << "姓名:" << name << ",年龄:" << age << endl;}
};// 友元函数实现
istream& operator>>(istream& is, Person& p) {// 读取姓名和年龄到p的私有成员is >> p.name >> p.age;return is;  // 返回流引用,支持连续输入
}int main() {Person p;cout << "请输入姓名和年龄:";cin >> p;  // 等价于operator>>(cin, p)p.show();  // 输出输入的姓名和年龄return 0;
}

递增运算符(++

核心规则

  • 前置 ++:无参数,返回对象引用(支持连续递增 ++(++a));
  • 后置 ++:带 int 哑元参数(仅用于区分重载),返回对象副本(先返回原值,再自增)。

方式 1:成员函数实现

#include <iostream>
using namespace std;class Counter {
private:int value;  // 计数器值public:/*** @brief 构造函数,初始化计数器值* @param val 初始计数值,默认0* @return 无返回值(构造函数无返回类型)*/Counter(int val = 0) : value(val) {}/*** @brief 成员函数重载前置++运算符,实现计数器自增* @return Counter& 返回当前对象的引用,支持连续递增* @note 先自增,再返回自身引用,无参数*/Counter& operator++() {++value;  // 先自增return *this;  // 返回自身引用}/*** @brief 成员函数重载后置++运算符,实现计数器自增* @param int 哑元参数(无实际意义,仅区分前置/后置重载)* @return Counter 返回自增前的对象副本* @note 先保存副本,再自增,最后返回副本*/const Counter operator++(int) {Counter temp = *this;  // 保存当前状态(自增前的值)++value;               // 自增return temp;           // 返回副本}/*** @brief 常成员函数,获取计数器值* @return int 当前计数值*/int getValue() const {return value;}
};int main() {Counter c(5);// 前置++:先自增,再取值++c;cout << "前置++后:" << c.getValue() << endl;  // 输出:6// 后置++:先取值,再自增Counter c2 = c++;cout << "后置++后c的值:" << c.getValue() << endl;   // 输出:7cout << "后置++返回的c2值:" << c2.getValue() << endl;  // 输出:6// 连续前置++++(++c);cout << "连续前置++后:" << c.getValue() << endl;  // 输出:9return 0;
}

方式 2:友元函数实现

#include <iostream>
using namespace std;class Counter {
private:int value;/*** @brief 友元函数重载前置++运算符* @param c 待自增的Counter对象*        引用:需要修改对象,且避免拷贝* @return Counter& 返回对象引用,支持连续递增*/friend Counter& operator++(Counter& c);/*** @brief 友元函数重载后置++运算符* @param c 待自增的Counter对象*        引用:需要修改对象,且避免拷贝* @param int 哑元参数,区分前置/后置* @return Counter 返回自增前的对象副本*/friend Counter operator++(Counter& c, int);public:Counter(int val = 0) : value(val) {}int getValue() const {return value;}
};// 前置++实现
Counter& operator++(Counter& c) {++c.value;return c;
}// 后置++实现
Counter operator++(Counter& c, int) {Counter temp = c;++c.value;return temp;
}int main() {Counter c(5);++c;cout << "前置++后:" << c.getValue() << endl;  // 6Counter c2 = c++;cout << "后置++后c的值:" << c.getValue() << endl;   // 7cout << "后置++返回的c2值:" << c2.getValue() << endl;  // 6return 0;
}

右移运算符(>>

场景 1:位运算右移(成员函数实现)

#include <iostream>
using namespace std;class BitMask {
private:int value;  // 位掩码值public:/*** @brief 构造函数,初始化位掩码值* @param val 位掩码初始值* @return 无返回值(构造函数无返回类型)*/BitMask(int val) : value(val) {}/*** @brief 成员函数重载>>运算符,实现位运算右移* @param shift 右移的位数(整数值)* @return BitMask 返回右移后的新BitMask对象* @note 隐含this指针指向左操作数(BitMask对象),右操作数是移位位数*/BitMask operator>>(int shift) const {return BitMask(value >> shift);}/*** @brief 常成员函数,获取位掩码的十进制值* @return int 十进制值*/int getValue() const {return value;}
};int main() {BitMask bm(8);  // 8的二进制:1000BitMask bm2 = bm >> 2;  // 右移2位,二进制:0010(十进制2)cout << "右移2位后的值:" << bm2.getValue() << endl;  // 输出:2return 0;
}

运算符重载实现方式对比表

运算符 成员函数实现特点 友元函数实现特点 普通函数实现限制
+ 隐含 this 指针(左操作数),仅需 1 个显式参数;
可直接访问私有成员
无 this 指针,需 2 个显式参数;
可直接访问私有成员(需友元声明)
无 this 指针,需 2 个显式参数;
仅能访问公有成员
> 隐含 this 指针(左操作数),仅需 1 个显式参数;
可直接访问私有成员
无 this 指针,需 2 个显式参数;
可直接访问私有成员(需友元声明)
无 this 指针,需 2 个显式参数;
仅能访问公有成员
= 必须作为成员函数实现;
隐含 this 指针(左操作数);
支持深拷贝;
返回自身引用支持连续赋值
不允许(C++ 语法强制限制) 不允许(C++ 语法强制限制)
<<(输出流) 无法实现(左侧需是 ostream 对象,
成员函数的 this 指针会占据左侧位置)
标准实现方式;
无 this 指针,需 2 个显式参数;
可直接访问私有成员
需访问公有成员;
无 this 指针,需 2 个显式参数
>>(输入流) 无法实现(左侧需是 istream 对象) 标准实现方式;
无 this 指针,需 2 个显式参数;
可直接修改对象成员
需访问 / 修改公有成员;
无 this 指针,需 2 个显式参数
++ 前置无参数 / 后置带 int 哑元;
隐含 this 指针;
可直接访问私有成员
前置 / 后置参数与成员函数一致;
需友元声明;
可直接访问私有成员
需访问公有成员;
参数与友元函数一致
>>(位运算) 隐含 this 指针(左操作数),
右操作数为移位位数;
可直接访问私有成员
无 this 指针,需 2 个显式参数(对象 + 移位位数);
需友元声明
仅能访问公有成员;
需 2 个显式参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025最新成都二手房装修公司top5推荐!成都优质家装品牌权威榜单发布,环保健康与品质工艺双保障助力理想家居焕新

引言 随着存量房市场持续扩容,二手房装修需求迎来爆发式增长,但行业存在设计同质化、环保不达标、施工质量参差不齐等问题,消费者面临“翻新难、选企难”的双重困境。据中国建筑装饰协会2025年Q1数据显示,全国二手…

实操教程:MindSpore中确定神经网络隐藏层与输出层神经元数量

实操教程:MindSpore中确定神经网络隐藏层与输出层神经元数量 在神经网络建模中,隐藏层/输出层神经元数量的配置直接决定模型性能。不合理的设置会导致欠拟合、过拟合或训练收敛困难。本文基于MindSpore框架,通过理论…

【3FS】条带化

文件序号 iter->second res = (x % 12) + 1 新 iter->second1 0 1 (0 + 4) % 12 = 42 4 5 (4 + 4) % 12 = 83 8 9 (8 + 4) % 12 = 04 0 1 45 4 5 86 8 9 0结果是: 起始 chain 序列:1 → 5 → 9 → 1 → 5 → 9…

一文读懂MindSpore的construct方法:神经网络的“自动流水线”

一文读懂MindSpore的construct方法:神经网络的“自动流水线” 在MindSpore里写神经网络时,总有个绕不开的construct方法——它既不用我们手动调用,却能让模型自动完成从输入到输出的计算。很多新手会疑惑:这方法到…

洛谷U639316 最长子串询问 题解 字符串哈希+二分

题目链接:https://www.luogu.com.cn/problem/U639316 解题思路: 二分,然后通过哈希判断子串是否相等。 示例程序: #include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 5; const unsigne…

AI规范编程 - specify-Kit

🤔 What is Spec-Driven Development?🤔 什么是规范驱动开发?Spec-Driven Development flips the script on traditional software development. For decades, code has been king — specifications were just …

2025最新成都精装房装修公司TOP5评测!一站式服务+品质保障,成都十区装修服务商权威榜单发布,重塑居家生活新体验

随着人们对居住品质要求的不断提升,精装房装修市场日益繁荣,选择一家靠谱的装修公司成为业主们的重要课题。本榜单基于服务专业性、环保健康性、工艺技术、设计能力及客户口碑五大维度,结合行业资深专家与真实业主反…

why North Korean are extremely anti-American, and think Nihon is a puppet of A.

pushed by USSR? but also, when did Nihon fucKillers become human? of course people will change in the new development...... so transition is important, also Korean should accept its destiny, in a wor…

可变参数模版中的折叠表达式

C++17 后,有一个特性可以对参数包的所有参数使用二元运算符计算结果(初始值可选)。 例如,下面的函数会返回所有入参的和: template<typename... T> auto foldSum (T... s) {return (... + s); // ((s1 + s2) …

scikit-learn 能否做深度学习?——兼谈不同神经元数量的模型对比实验实现

scikit-learn 能否做深度学习?——兼谈不同神经元数量的模型对比实验实现 在机器学习工具选型中,很多人会有一个疑问:scikit-learn(简称sklearn)只支持传统机器学习,不包含深度学习功能吗? 答案是:不完全准确。…

吟诗一首

朝起练武 雨如白绫\(^1\) 借因此由 幡然\(^2\)巡礼\(^3\) 至汐山\(^4\)中 四季各色 夏水醒目 秋打麦谷 冬月栞\(^5\)雪 春播芦花 又至户隐\(^6\) 椎叶\(^7\)纷飞 花蕾窈娜 长路茉紫\(^8\) 屋中和奏 墨染溪流 如此宁宁\…

深入解析USB侦探:数字取证数据流分析技术

USB侦探是一款专注于USB设备数字取证的工具,能够提取和分析USB连接历史、设备信息、文件痕迹等关键数据,帮助调查人员追踪设备使用痕迹,恢复删除文件,重建数据访问时间线,适用于网络安全事件调查和司法取证。引入…

Oracle数据库性能诊断与SQL优化实战指南

Oracle数据库性能诊断与SQL优化实战指南在数据库运维与开发中,Oracle数据库的高性能稳定运行是业务连续性的核心保障。随着数据量增长与并发访问加剧,性能瓶颈往往成为系统短板,而SQL语句优化与执行计划调优是解决性…

56

所学时间:9小时

re:MARS 2022:聚焦机器学习与机器人技术的年度盛会

某中心宣布其线下活动re:MARS 2022注册开启,该活动将探讨机器学习、自动化、机器人及空间技术领域的最新进展与实际应用,汇聚行业领袖与技术专家进行深入分享与交流。某中心re:MARS 2022活动注册开启 某中心今日宣布…

深入解析:Spring Boot 3.2 高性能架构实战:虚拟线程、原生镜像与响应式编程全解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CMake-模块化

CMake-模块化环境 系统:Windows 10专业版 CMake版本:3.31.5 Visual Studio版本:2019 Qt版本:5.15.2 准备工作 1.安装CMake,并确保CMake的运行程序添加到环境变量中; 2.安装Visual Studio 2019,并确保勾选了“使…

测试用例的编写和注意事项

一、编辑测试用例 1、编辑测试用例的必要性2、编辑测试用例的基准3、编辑测试用例的模板4、用例设计思路5、如何展开编辑测试用例二、如何确保测试用例的有效性三、编辑测试用例过程中遇到的问题如何处理四、如何才能通…

割点和桥

无向图的连通性,主要研究割点和桥。本文介绍了割点和桥的定义及其延伸概念,介绍了如何用 Tarjan 算法求解割点与桥,包括对于图是否有重边的讨论。提供了相应的好题作为例题。普及+/提高前置知识 无向图的连通性,主…

AI元人文构想全维解构:从意义行为原生到文明价值操作系统

AI元人文构想全维解构:从意义行为原生到文明价值操作系统 引言:范式革命的必然性 传统人工智能伦理中的"价值对齐"范式正陷入根源性困境。这种范式试图将人类价值观编码为AI系统可遵循的静态规则,却在认识…