C++从入门到精通 第八章(类和对象)【下】

从零入门C++:系统性学习路径与实战指南 专为编程新手设计的保姆级C++学习手册! 以「理论+实战+调试」为核心,带你从零掌握C++编程精髓,覆盖开发环境搭建、语法底层逻辑、STL高效应用、面向对象设计、智能指针、多线程编程等全栈技能。 阅读详情

 写在前面:

  1. 本系列专栏主要介绍C++的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程,笔者的原创部分主要在示例代码的注释部分。
  2. 除了参考下面的链接教程以外,笔者还参考了其它的一些C++教材(比如计算机二级教材和C语言教材),笔者认为重要的部分大多都会用粗体标注(未被标注出的部分可能全是重点,可根据相关部分的示例代码量和注释量判断,或者根据实际经验判断)。
  3. 由于C++基本继承了C语言的所有内容,建议读者先阅读C语言系列的专栏,有一些重点是仅在C语言系列专栏中有介绍的(比如二级指针、预处理等)。
  4. 如有错漏欢迎指出。

参考教程:黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili

四、动态内存分配的相关问题

1、为对象分配动态存储空间

(1)到目前为止,在为程序中定义的对象分配内存空间时采用的都是“静态存储方式”,在编译时就确定了所占存储空间的大小,而与之相对的动态存储分配技术则可以保证在程序运行过程中按照实际需要申请适量内存,使用结束后再进行释放,这种在程序运行过程中根据需要可以随时建立或删除的对象称为自由存储对象,建立和删除工作分别由运算符new和delete完成。

(2)用new创建单个对象时,要根据参数调用相应的构造函数;在用new创建对象数组时,会调用默认构造函数;用delete删除对象时,要调用析构函数。

(3)举例:

#include<iostream>
using namespace std;

class Person
{
public:
	
	Person(int _age, int _height, bool _sex = false) : age(_age), sex(_sex)
	{
		cout << "Person构造函数的调用" << endl;
		height = _height;
	}
	Person()
	{
		cout << "Person构造函数的调用" << endl;
	}

	~Person()
	{
		cout << "~Person析构函数的调用" << endl;
	}
	int age;
	int height;
	bool sex;
};

int main() {
	
	Person *point;
	point= new Person(18, 160, true);
	//调用一次对象p的构造函数
	delete point;
	//调用一次对象p的析构函数
	point = new Person[2];
	//调用两次对象p的构造函数
	delete[] point;
	//调用两次对象p的析构函数

	return 0;
}

2、深拷贝与浅拷贝

(1)浅拷贝是简单的赋值拷贝操作,而深拷贝是在堆区重新为成员变量申请空间,进行拷贝操作,如果成员属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题。

(2)举例:

#include<iostream>
using namespace std;

class Person 
{
public:
	//无参(默认)构造函数
	Person() 
	{
		cout << "无参构造函数!" << endl;
	}
	//有参构造函数
	Person(int age, int height) 
	{
		cout << "有参构造函数!" << endl;
		m_age = age;
		m_height = new int(height);

	}
	//拷贝构造函数  
	Person(const Person& p) 
	{
		cout << "拷贝构造函数!" << endl;
		//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
		m_age = p.m_age;
		m_height = new int(*p.m_height);
	}
	//析构函数
	~Person() 
	{
		cout << "析构函数!" << endl;
		if (m_height != NULL)
		{
			delete m_height;
			m_height = NULL;
		}
	}
public:
	int m_age;
	int* m_height;
};

void test01()
{
	Person p1(18, 180);
	Person p2(p1);
	cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;
	cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

五、静态成员

1、概述

(1)对于类中的非静态数据成员,每一个类对象都拥有一个副本,即每个对象的同名数据成员可以分别存储不同的数值,而类中的静态成员则不是,甭管一个类创建了多少个对象,这个静态成员都只有一个副本,这个副本由所有属于这个类的对象共享。

(2)静态成员表示整个类范围的信息,其声明以static关键字开始,包括静态数据成员和静态成员函数。

2、静态数据成员

(1)静态数据成员在每个类对象中并不占有存储空间,它只是在每个类中分配有存储空间供所有对象公用,内存分配在编译阶段就已经完成。

(2)在对静态数据成员初始化时应注意:

①在类中使用关键字static对静态数据成员进行声明,在类体外对静态数据成员进行初始化(静态数据成员的初始化与它的访问控制权限无关)。

②静态数据成员初始化时前面不加static关键字,以免与一般静态变量或对象混淆。

③由于静态数据成员是类的成员,因此在初始化时必须使用作用域运算符(::)限定它所属的类。

(3)举例:

#include<iostream>
using namespace std;
#include<string>


class Person
{
public:
	
	string m_name;
	static int m_A;   //所有对象都共享同一份数据;在编译阶段就分配内存;类内声明,类外初始化
private:
	static int m_B;
};
int Person:: m_A = 100;
int Person:: m_B = 200;

void test01()
{
	Person p;
	cout << p.m_A << endl;
	Person p2;
	p.m_A = 200;
	cout << p.m_A << endl;
	//cout << p.m_B << endl;  //静态成员变量也是有访问权限的
};
void test02()
{
	//静态成员变量不仅属于某个对象,所有对象共享同一份数据,所以静态成员变量有两种访问方式
	//通过对象进行访问
	Person p;
	cout << p.m_A << endl;
	//通过类名进行访问
	cout << Person::m_A << endl;
}

int main() {

	test01();
	test02();

	system("pause");

	return 0;
}

3、静态成员函数

(1)公有的静态数据成员可以直接访问,但私有的或保护的静态数据成员必须通过公有的接口进行访问,一般将这个公有的接口定义为静态成员函数。

(2)使用static关键字声明的成员函数就是静态成员函数,静态成员函数也属于整个类而不属于类中的某个对象,它是该类的所有对象共享的成员函数。

(3)静态成员函数可以在类体内定义,也可以在类外定义,当在类外定义时,要注意不能使用static关键字作为前缀。

(4)静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员,若要访问非静态成员,必须通过参数传递的方式得到相应的对象,再通过对象进行访问。

(5)公有的静态成员既可以直接使用作用域运算符通过类名进行访问,也可以通过类的任何对象进行访问,建议使用前者进行访问,即:

        <类名>::<静态数据成员名>    或    <类名>::<静态成员函数名>(<参数表>)

#include<iostream>
using namespace std;

class Person
{
public:
	static void func()     //静态成员函数只能访问静态成员变量;所有对象共享同一个函数
	{
		cout << "static void func()调用" << endl;
		m_A = 100;
		//a = 100;    不能访问非静态成员变量,它无法区分这是哪个对象的成员
		func2();      //类内可以访问私有权限的静态成员函数
	}
	static int m_A;   //静态成员变量
	int a;
private:
	static void func2()     
	{
		cout << "static void func2()调用" << endl;
		m_A = 300;
	}
};
int Person::m_A = 0;

void test01()
{
	//通过对象访问函数
	Person p;
	p.func();
	//通过类名访问函数
	Person::func();
	//Person::func2();    类外不能访问私有权限的静态成员函数
};

int main() {

	test01();

	system("pause");

	return 0;
}

六、this指针

1、成员变量和成员函数的存储

在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才存储在类的对象上。

#include<iostream>
using namespace std;

class Person1
{
public:

};
class Person2
{
public:
	int m_A;   //非静态成员变量,存储在类的对象上
};
class Person3
{
public:
	static int m_B;    //静态成员变量,不属于类的对象上
};
int Person3::m_B = 10;
class Person4
{
public:
	void func()        //非静态成员函数,不属于类的对象上
	{

	}
};
class Person5
{
public:
	static void func()        //静态成员函数,不属于类的对象上
	{

	}
};

void test01()
{
	Person1 p1;
	cout << "size of p1 =" << sizeof(p1) << endl;   
	//空对象占用内存空间为1,因为C++编译器会给每个空对象分配一个字节空间,以区分空对象占内存的位置
	//每个空对象也都应该有一个独一无二的内存地址
	Person2 p2;
	cout << "size of p2 =" << sizeof(p2) << endl;   //占用内存空间为4
	Person3 p3;
	cout << "size of p3 =" << sizeof(p3) << endl;   //占用内存空间为1
	Person4 p4;
	cout << "size of p4 =" << sizeof(p4) << endl;   //占用内存空间为1
	Person5 p5;
	cout << "size of p5 =" << sizeof(p5) << endl;   //占用内存空间为1
};

int main() {

	test01();

	system("pause");

	return 0;
}

2、this指针详解

(1)每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码,为了让非静态成员函数知晓自己被哪个对象调用,C++提供了一个特殊的对象指针——this指针,它是成员函数所属对象的指针,指向类对象的地址,成员函数可以通过这个指针知道自己属于哪一个对象。

(2)this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,明确地表示出了成员函数当前操作的数据所属的对象。

(3)this指针不需要定义,直接使用即可。

(4)this指针的用途:

①当形参和成员变量同名时,可用this指针来区分。(当形参和成员变量同名时,不使用this指针会将同名标识符默认为形参;没有同名情况可以不使用this指针)

②在类的非静态成员函数中返回对象本身,可使用return *this。

#include<iostream>
using namespace std;

class Person
{
public:
	Person(int age)
	{
		this->age = age;   //this指针指向被调用的成员函数所属的对象
	}
	int age;
	void PersonAddAge(Person &p)
	{
		this->age += p.age;
	}
	Person& PersonAddAge2(Person &p)    //不要以值的方式返回,这样每调用一次函数就会创建一个新对象,在链式编程中容易出现错误
	{
		this->age += p.age;
		return *this;    
	}
};

void test01()
{
	Person p1(18);       //(构造函数中)this指针指向p1
	cout << "p1的年龄为" << p1.age << endl;  
	Person p2(20);
	p2.PersonAddAge(p1); //this指针指向p2
	cout << "p2的年龄为" << p2.age << endl;
	p2.PersonAddAge2(p1).PersonAddAge2(p1).PersonAddAge2(p1);   //链式编程思想
	//this是指向p2的指针,而*this就是p2这个对象本体
	cout << "p2的年龄为" << p2.age << endl;

};

int main() {

	test01();

	system("pause");

	return 0;
}

3、空指针访问成员函数

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针,如果用到this指针,需要加以判断保证代码的健壮性。

#include<iostream>
using namespace std;

//空指针调用成员函数
class Person
{
public:
	
	int m_Age;
	
	void shouClassName()
	{
		cout << "this is Person class" << endl;
	}
	void showClassAge()
	{
		if (this == NULL)
		{
			return;     //如果指针为空,赶紧返回,防止程序崩溃
		}
		cout << "age = " << m_Age << endl;    //相当于cout << "age = " << this->m_Age << endl;
	}
};

void test01()
{
	Person * p= NULL;       
	p->shouClassName();
	p->showClassAge();       //传进去的指针是NULL,this不知道指向谁
};

int main() {

	test01();

	system("pause");

	return 0;
}

七、常成员

1、常对象

(1)使用const关键字修饰的对象称为常对象,它的定义格式如下:

        <类名> const <对象名>    或    const <类名> <对象名>

(2)常对象在定义时必须进行初始化,且不能被更新。(成员属性声明时加关键字mutable后,在常函数中依然可以修改)

(3)常对象只能调用常函数。

2、常成员函数

(1)使用const关键字说明的成员函数称为常成员函数,它的说明格式如下:

        <返回类型> <成员函数名>(<参数表>) const;

(2)常成员函数不能更新对象的数据成员,否则会产生错误。

(3)const关键字可以用于参与对重载函数的区分,重载的原则是:当类中有两个或多个同名的一般成员函数和常成员函数时,常对象调用常成员函数,一般对象调用一般成员函数;当类中只有一个常成员函数时,一般对象也可以调用该常成员函数。

3、常数据成员

使用const说明的数据成员称为常数据成员,常数据成员同样也必须进行初始化,并且不能被更新,且常数据成员的初始化只能通过构造函数的成员初始化列表显式进行。

4、举例

#include<iostream>
using namespace std;

class Person
{
public:

	int m_A;
	mutable int m_B;     //特殊变量,即使在常函数中依然可以修改
	const int m_C;
	void showPerson() const
	{
		//this->m_A = 100;   在成员函数后加const就是修饰this指针,相当于const Person * const this;
		//this = NULL;       this指针的本质是指针常量,指向不可修改,有没有const都一样
		this->m_B = 100;
	}
	void func()
	{

	}
	Person(int C) : m_C(C)  //常数据成员的初始化只能通过构造函数的成员初始化列表显式进行
	{

	}
};

void test01()
{
	Person p(25);
	p.showPerson();
};
void test02()
{
	const Person p(20);    //常对象
	//p.m_A = 100;    常对象的属性不可以乱改
	p.m_B = 100;       //m_B是特殊变量,在常对象下也可以修改
	p.showPerson();
	//p.func();       常对象只能调用常函数,不能调用普通成员函数,否则可能会造成普通属性的修改
};

int main() {

	test01();
	test02();

	system("pause");

	return 0;
}

八、友元

1、概述

(1)类具有数据封装和隐藏的特性,只有类的成员函数才能访问类的私有成员和保护成员,外部函数只能访问类的公有成员,但在某些情况下又需要在类的外部访问类的私有成员和保护成员,为了解决这个问题,C++引入了友元,友元可以在类外部直接访问类的私有成员和保护成员。

(2)对于一个类,可以利用friend关键字将一般函数、其它类的成员函数或者是其它类声明为该类的友元,使得这个类中本来隐藏的信息(包括私有成员和保护成员)可以被友元所访问,如果友元是一般成员函数或者是类的成员函数则称为友元函数,如果友元是一个类则称为友元类,友元类的所有成员函数都成为友元函数。

2、友元函数

(1)友元函数不是当前类的成员函数,而是独立于当前类的外部函数(包括普通函数和其它类的成员函数),但它可以访问该类的所有成员,包括私有成员、保护成员和公有成员。

(2)友元函数要在类定义时声明,声明时要在其函数名前加上关键字friend,该声明可以放在公有部分,也可以放在私有部分或是保护部分。友元函数的定义通常在类外部。

(3)两种友元函数:

①全局函数做友元:

#include<iostream>
using namespace std;
#include<string>

class Building
{
	friend void goodGay(Building &building);   //goodGay全局函数是Building的好朋友,可以访问Building中的私有成员
public:
	
	string m_SittingRoom;   //客厅
	Building()
	{
		m_SittingRoom = "客厅";
		m_BedRoom = "卧室";
	}
private:
	string m_BedRoom;      //卧室
};

void goodGay(Building &building)
{
	cout << "好朋友全局函数 正在访问:" << building.m_SittingRoom << endl;
	cout << "好朋友全局函数 正在访问:" << building.m_BedRoom << endl;
};
void test01()
{
	Building building;
	goodGay(building);
};

int main() {

	test01();

	system("pause");

	return 0;
}

②其它类的成员函数做友元:

#include<iostream>
using namespace std;
#include<string>

class Building;     //先让GoodGay中的visit函数被声明,否则到friend一行编译器会不认识visit函数
class GoodGay
{
public:
	GoodGay();
	Building * building;
	void visit();          //希望visit可以访问Building中的私有成员
	void visit2();         //希望visit2不可以访问Building中的私有成员
};
class Building
{
	friend void GoodGay::visit();   //告诉编译器,GoodGay类下的visit成员函数作为本类的好朋友可以访问本类的私有内容
public:
	
	Building();
	string m_SittingRoom;   //客厅
	
private:
	string m_BedRoom;      //卧室
};

Building::Building()
{
	m_SittingRoom = "客厅";
	m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
	building = new Building;
}
void GoodGay::visit()
{
	cout << "visit函数正在访问:" << building->m_SittingRoom << endl;
	cout << "visit函数正在访问:" << building->m_BedRoom << endl;
}
void GoodGay::visit2()
{
	cout << "visit2函数正在访问:" << building->m_SittingRoom << endl;
	//cout << "visit2函数正在访问:" << building->m_BedRoom << endl;
}

void test01()
{
	GoodGay gg;
	gg.visit();
	gg.visit2();
};

int main() {

	test01();

	system("pause");

	return 0;
}

3、友元类

(1)友元除了可以是函数外,还可以是类,即一个类可以作为另一个类的友元,称为友元类,友元类的所有成员函数都是友元函数。

(2)友元类要在类定义时声明,声明时要在类名名前加上关键字friend,该声明可以放在公有部分,也可以放在私有部分或是保护部分。

(3)举例:

#include<iostream>
using namespace std;
#include<string>

class Building;       //声明一下后面有写这个类,防止报错
class GoodGay
{
public:
	Building * building;
	void visit();     //参观函数,访问Building中的属性
	GoodGay();
};

class Building
{
	friend class GoodGay;    //GoodGay类是本类的好朋友,可以访问本类的私有成员
public:
	
	string m_SittingRoom;   //客厅
	Building();

private:
	string m_BedRoom;      //卧室
};

//类外写成员函数
Building::Building()
{
	m_SittingRoom = "客厅";
	m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
	//在堆区创建建筑物对象
	building = new Building;
}
void GoodGay::visit()
{
	cout << "好朋友类正在访问:" << building->m_SittingRoom << endl;
	cout << "好朋友类正在访问:" << building->m_BedRoom << endl;
}

void test01()
{
	GoodGay gg;
	gg.visit();
};

int main() {

	test01();

	system("pause");

	return 0;
}

九、对象数组

1、对象数组的概念

对象数组是指数组元素为对象的数组,该数组中的每一个元素都是同一个类的对象。

2、对象数组的定义

        <类名> <数组名>[<大小>];

3、访问对象数组元素的成员的形式

        <数组名>[<下标>].<成员名>    或    (<数组名>+<下标>)-><成员名>

十、涉及类的分文件编写

所有代码挤在一个文件中,代码量过大,可以将部分代码移至分文件中,如下例所示:

C++入门经典第10版学习指南:资源获取、环境搭建与高效学习方法 C++作为一门经典的面向对象编程语言,其核心在于通过编译器将高级代码转换为可执行机器指令。理解编译、链接的原理是掌握C++开发的基础,这直接关系到程序能否正确构建与运行。对于初学者而言,选择一本结构清晰、配套资源完善的教材至关重要,它能系统性地引导学习者从语法基础过渡到现代C++特性。在工程实践中,一个稳定、友好的开发环境(如Visual Studio)和科学的实操方法(如结合配套源码调试)能极大提升学习效率,减少在环境配置和基础错误排查上的时间消耗。本文围绕《C++入门经典(第10版)》这一经典教材,针对 阅读详情

相关推荐

Tiny windows 11 安装与部署

需要注意,安装完后键入 windows 键,输入 update 先更新系统。点击开始,等待完成即可,用户可自定义。

m0_73351035的博客 9044

C++从入门到精通 第八章(类和对象)【上】

封装、继承、多态。(2)C++认为万事万物都皆为对象,对象上有其属性和行为。例如:①人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌...②车也可以作为对象,属性有轮胎、方向盘、车灯...,行为有载人、放音乐、放空调...(3)具有相同性质的对象,我们可以抽象称为类,例如人属于人类、车属于车类。(1)类的定义可以分为说明部分和实现部分两部分,其中说明部分说明类中包含的数据成员和成员函数,实现部分是对成员函数的定义。(2)类定义的一般格式如下://类的说明部分。

Zevalin的博客 1075

5G(NR)物理层面试问答

1.什么是参数集(Numerologies)? 答:在5G中由于其频段很宽,设置了不同的子载波带宽,另根据频段、循环前缀、帧结构等组成了参数集。 2.5G中的循环前缀有几种? 答:5G网络支持5种子载波间隔,有两种循环前缀(正常和扩展)。其中:参数集2,即子载波间隔60kHz支持常规循环前缀和扩展循环前缀。 3.5G无线网络在下行(DL)和上行(UL)均使用OFDM波形? 答:5G网络下行链路(DL)和上行链路(UL)使用的波形及处理见下图: 4.5G物理层帧和子帧是多长时间? 答:5G.

starts1990的博客 2375

C++入门到精通——第八章 未归类知识点

八、未归类知识点 Author: XFFer~ 01 函数调用运算符、function类模版 1 函数调用运算符 2 map类模版 3 function类模版 函数调用运算符 (),如果在类中重载了函数调用运算符(),那么就可以像使用函数一样使用该类的对象了,对象(实参)。 system("pause");暂停程序运行,等待任意键继续执行。 class biggerthan { public:...

LY. RoboLab 1313

【智能制造】- APS系列|05 APS 排产的五大底层算法逻辑

很多人误以为APS只是给生产工单排先后顺序,实则整套系统依托成熟算法体系,完成多维度约束下的最优生产决策在制造业数字化排产普及的当下,依旧有不少制造管理者对APS存在认知误区,将其等同于简易工单排序工具。事实上,专业级高级计划与排程系统,早已脱离单纯按时间排序的基础功能,而是依托一整套成熟完善的底层算法逻辑,整合现场各类生产限制条件,在海量变量中自动推演、筛选、输出最贴合企业经营目标的生产方案。

qq_40821260的博客 433

保姆级教程:在Ubuntu 20.04上搞定PX4飞控与T265的视觉定位(附避坑指南)

本文提供在Ubuntu 20.04上配置PX4飞控与T265视觉定位系统的详细教程,涵盖驱动安装、ROS与MAVROS桥接、PX4参数调优及故障排查。通过实测验证的步骤和避坑指南,帮助开发者实现厘米级精度的视觉定位,特别适合室内无人机应用。

weixin_29038155的博客 248

精通 C++ 编程(四)

在本章中,您学到了以下内容行为驱动开发简称为 BDD。BDD 是一种自顶向下的开发方法,并使用 Gherkin 语言作为领域特定语言(DSL)。在一个项目中,BDD 和 TDD 可以并行使用,因为它们互补而不是取代彼此。cucumber-cpp BDD 框架利用 wire 协议来支持非 ruby 平台编写测试用例。通过实施测试驱动开发方法,您以实际方式学习了 BDD。BDD 类似于 TDD,它鼓励通过以增量方式短间隔重构代码来开发清晰的代码。

龙哥盟 2027

Materials Studio实战技巧(八)——利用片段库高效构建有机金属配合物

本文详细介绍了在Materials Studio中利用Fragment Browser(片段浏览器)高效构建有机金属配合物的实战技巧。通过调用预置的Metal Templates和Ligands库,用户可以快速搭建如茂金属催化剂等复杂分子骨架,并利用对称性操作精确控制Meso与Rac构型。文章还涵盖了自定义片段库的创建与使用,能显著提升建模效率,适用于计算化学与材料模拟领域的研究者。

wine的专栏 931

C++最全面复习:从入门到精通(2026年)

本文系统梳理了C++的核心知识体系,涵盖基础语法到现代特性,从面向对象到并发编程。主要内容包括: C++八大核心板块: 基础语法与类型系统(引用、const、auto) 指针与内存管理(智能指针) 面向对象(封装、继承、多态) 模板与泛型编程 STL标准库 现代C++特性(Lambda、移动语义) 多线程与并发 异常处理与RAII 关键语法解析: 引用与指针区别(必须初始化、不可空) const的四种用法(变量、指针、引用、成员函数) auto自动类型推导与decltype类型获取 面向对象核心: 封装(访

我是一颗柠檬的博客 3125

VC Spyglass:Lint实战指南之TCL脚本自动化解析

本文详细介绍了如何利用TCL脚本实现VC Spyglass Lint检查的自动化流程。通过实战指南,从基础脚本编写到高级参数化技巧,帮助数字IC设计工程师摆脱手动操作,提升验证效率,并实现与CI/CD流程的集成。

h3i4j的博客 795

【学习系列】SAP RAP 3:添加多层级的子节点

本文详细介绍了在SAP ABAP RAP开发中如何创建多层级业务对象。主要内容包括:1)创建明细和计划行层级的数据库表及CDS视图;2)使用association和composition关键字建立父子关联关系;3)创建各层级的投影视图并设置层级关系;4)更新行为定义,添加关联、操作权限等控制;5)更新服务定义公开新增视图;6)创建元数据扩展优化UI展示。通过这一系列步骤,实现了从抬头到明细再到计划行的完整业务对象层级结构,为后续UI功能扩展奠定了基础。

DeveloperMrMeng的博客 587

一、C++入门详细笔记

文章目录变量常量关键字标识符命名规则整型sizeof关键字实型(浮点型)字符型转义字符 变量 int a = 10; //变量 常量 常量不可修改 两种定义方法: 第一种: #define 宏常量 语法:#define 常量名 常量值 #define Day 7 一般定义在代码的上方,结尾不需要分号 #include <iostream> using namespace std; #define Day 7 int main() { cout << "一周共有多少天:

zdb 1万+

【数据分析】基于多组学数据整合的微生物与宿主互作网络构建及可视化分析

综上所述,本教程通过详细的步骤和方法,展示了如何整合微生物群落数据、宿主基因表达数据和代谢组数据,构建微生物与宿主互作网络,并进行可视化分析。这种方法为研究微生物与宿主之间的复杂关系提供了一种有力的工具,有助于推动相关疾病的研究和治疗。然而,在实际应用中,需要注意数据处理和分析过程中的各种问题,并结合实验验证来提高研究结果的可靠性和科学性。未来,随着多组学技术的不断发展和完善,以及数据分析方法的创新,相信我们能够更深入地理解微生物与宿主之间的互作机制,为疾病的预防、诊断和治疗提供更有力的支持。

专注生信领域 366

C++入门到精通 ——第七章 STL标准模板库大局观

七、STL标准模板库大局观 Author: XFFer_

LY. RoboLab 1111

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++高级编程 第九章: 精通类和对象

本章节最主要讲了在类的构造和析构方面, 内存是怎样分配的, 还有几个关键字 : static, const, virtual, inline, 各种重载等等知识点.1. 究竟什么时候需要自己写构造函数, 赋值函数, 拷贝构造函数?只要你写的这个类, 在类里面会动态分配内存(就是new一个类型出来), 你就要自己写一份 构造函数, 赋值函数, 拷贝构造函数. 这是为啥呢? 下面来看例子class a{

Francis_s的博客 470

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

精通 C++ 编程(一)

C++是一种有趣的编程语言,已经存在了将近三十年。它用于开发复杂的桌面应用程序、Web 应用程序、网络应用程序、设备驱动程序、内核模块、嵌入式应用程序以及使用第三方小部件框架的 GUI 应用程序;可以说,C++可以在任何领域使用。自 1993 年开始编程以来,我一直珍惜与许多同事和行业专家进行的良好的技术讨论。在所有的技术讨论中,有一个话题一再重复,那就是,“你认为 C++今天还是一个相关的编程语言吗?

龙哥盟 588

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MyBatis3.2.x从入门到精通系列

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版) ②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版) ③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版) ④【Web前端】从HT...

黑技的博客 341

C#从入门到精通(第四版)学习记录-- 第8、9章

C#从入门到精通(第四版)学习记录-- 第8、9章 方法、结构和类

qq_34552942的博客 206

全网最详Android framework从入门到精通【程序员必看】

Android Framework在Android开发中扮演着至关重要的角色。它提供了丰富的功能和工具,使得开发者能够轻松创建高质量、稳定可靠的Android应用程序。因此,对于Android开发者来说,熟练掌握Android Framework是必不可少的。在这里为大家提供一份《Android framework从入门到精通》,祝大家学完后都能升职加薪。有需要的朋友可以扫描下方二维码,免费获取更多相关学习资料。

Gaga246的博客 8889

opencv 轻松入门 面向python pdf_100天,轻松带你Python入门到精通

100天,轻松带你Python入门到精通python于1989年由荷兰人Guido van Rossum创造,Python拥有强大的第三方库,能够提供很多模块,使模块连接起来,被称为“胶水语言”。Python支持伪编译,是一种跨平台、开源、免费的解释型高级语言,支持面向对象程序设计,语法简洁。Python语言的应用:100天,轻松带你Python入门到精通近年来,随着人工智能的发展,Python更...

weixin_39609718的博客 626

精通 C++ 多线程(一)

多线程应用程序在单处理器环境中执行多个线程,以实现。本书充满了实际示例,将帮助您成为在 C++中编写健壮的并发和并行应用程序的专家。在本书中,您将深入了解多线程和并发的基础知识,并了解如何实现它们。在此过程中,您将探索原子操作以优化代码性能,并将并发应用于分布式计算和 GPGPU 处理。在本章中,我们讨论了使用本机线程 API 在 C++中实现多线程应用程序的基础知识。我们看了如何让多个线程并行执行任务,并探讨了如何在多线程应用程序中正确使用 STL 中的随机数 API。

龙哥盟 714

某一线互联网大厂内部超高质量Flutter+Kotlin笔记!技术与实战篇!

首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶注解原理丶注解原理丶序列化Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)代码框架结构优化(数据结构丶排序算法丶设计模式)APP性能优化(用户体验优化丶适配丶代码调优)热修复丶热升级丶Hook技术丶IOC架构设计。

2401_84149505的博客 396

opencv轻松入门面向pythonpdf下载_你要悄悄学Python!100天,轻松带你Python入门到精通...

python于1989年由荷兰人Guido van Rossum创造,Python拥有强大的第三方库,能够提供很多模块,使模块连接起来,被称为“胶水语言”。Python支持伪编译,是一种跨平台、开源、免费的解释型高级语言,支持面向对象程序设计,语法简洁。Python语言的应用:近年来,随着人工智能的发展,Python更是风生水起,自2004年开始,Python使用率不断上升,在编程语言排行榜中,不...

weixin_39804059的博客 588

c++程序设计(第3版)系列教程

包含计算机科学与技术专业所学部门C++章节详细笔记,主要包含OOP

随手小记 1576

精通 C++17 STL(一)

C++语言有着悠久的历史,可以追溯到 20 世纪 80 年代。最近,它经历了一次复兴,2011 年和 2014 年引入了重大新特性。在出版时,C++17 标准即将到来。C++11 实际上将标准库的大小翻了一番,添加了如、和等头文件。C++17 再次将库翻了一番,添加了如、和等新特性。那些一直忙于编写代码而不是关注标准化过程程序员可能会觉得标准库已经脱离了他的掌控——因为库中有太多新事物,他可能永远无法掌握整个库,甚至无法区分精华和糟粕。毕竟,谁愿意花一个月的时间阅读关于和的技术文档,结果发现它们在日常工作中

龙哥盟 469
上一篇: C++从入门到精通 第八章(类和对象)【上】
下一篇: C++从入门到精通 第九章(继承和多态)【上】
Zevalin爱灰灰
Zevalin爱灰灰 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄3年 7137粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值