首页 > 编程语言 >C++学习(二)

C++学习(二)

时间:2023-06-15 18:57:57浏览次数:39  
标签:10 name int age C++ 学习 Person cout

拷贝构造函数 对象1 = 对象2 :默认的拷贝构造函数

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct Person{
 5     int age;
 6     string name;
 7 };
 8 
 9 int main(){
10     Person p1 = {10,"张三"};
11     cout << "age: "<<p1.age <<"  name:"<< p1.name << endl;
12     cout << "p1内存地址:"<< &p1 << endl;
13     // = 这里是隐式调用:寻找 p1地址对应的成员的值(10,张三) ,寻找p2地址对应的成员,并将值(10,张三) 赋值给它
14     //但是 内存地址已经不是同一个了
15     Person p2 = p1;
16     cout << "p2内存地址:"<< &p2 << endl;
17     
18     return 0;
19 }
20 log:
21 age: 6  name:张三
22 p1内存地址:0x7fff1a2db570
23 p2内存地址:0x7fff1a2db5a0
 1 例2:
 2 
 3 #include <iostream>
 4 using namespace std;
 5 
 6 struct Person{
 7     int age;
 8     string name;
 9     Person(){
10     cout << "我是无参构造函数"<< endl;
11     }
12     
13     Person(int age):Person(age,"李四"){
14     cout << "我是1个参数构造函数"<< endl;
15     }
16     Person(int age,string name){
17     cout << "我是2个参数构造函数"<< endl;
18     }
19     
20  //自定义拷贝函数
21     Person(const Person &person){
22     cout << "我是拷贝函数"<< endl;
23     this->age = person.age;
24     this->name = person.name;
25     }
26     ~Person(){
27     cout << "我是析构函数"<< endl;
28     }
29 };
30 
31 int main(){
32     Person p1 = {10,"张三"};
33     Person p2 = p1;
34         
35    //方式2:此种方式不会调用我们自定义的拷贝函数,但是会调用系统默认的拷贝函数
36    Person p2;
37     p2 = p1;
38     
39     return 0;
40 }
41 //log:
42 我是2个参数构造函数
43 我是拷贝函数
44 我是析构函数
45 我是析构函数
46 为何会执行析构函数?答: 此时在栈空间开辟,return时弹栈2次。
 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct Person{
 5     int age;
 6     string name;
 7     Person(){
 8     cout << "我是无参构造函数"<< endl;
 9     }
10     
11     Person(int age):Person(age,"李四"){
12     cout << "我是1个参数构造函数"<< endl;
13     }
14     Person(int age,string name):name(name),age(age){
15     cout << "我是2个参数构造函数"<< endl;
16     }
17     
18     Person(const Person & person){
19     cout << "我是拷贝函数"<< endl;
20     this->age = person.age;
21     this->name = person.name;
22     }
23     ~Person(){
24     cout << "我是析构函数"<< endl;
25     }
26 };
27 
28 int main(){
29     Person *p1 = new Persion(100,"张三");
30     Person *p2 = p1;
31     //此时不会执行拷贝构造函数。
32     //原理: p1 在栈区开辟空间,指向堆区地址0x1000h,它自身也有个内存地址
33     //new Person  在堆区开辟空间,堆存内存地址:0x1000h,
34     // p1 指向 new Persion 堆区对象地址;
35     //p2 指针指向p1地址。
36     //这是指针指向问题。 
37     return 0;
38 }

 

常量指针、指针常量  
 1 #include <iostream>
 2 #include "string.h"
 3 using namespace std;
 4 
 5 int main(){
 6     int num =9;
 7     int num2 =10;
 8  //常量指针
 9     const int *  numnew = &num2;
10     //*numnew = 100; 不允许更改 常量指针存放地址的值
11     numnew = &num;//但是可以更改常量指针存放的地址
12     cout << "numnew:" << *numnew << endl;
13     
14     //指针常量
15     int *  const numnew = &num2;
16     *numnew = 100; 允许更改 指针常量存放地址的值
17     //numnew = &num;//不允许更改常量指针存放的地址
18     
19     //常量指针常量则都不允许修改
20     
21    return 0;
22 }

 

深拷贝、浅拷贝
 1 class  Student{
 2     
 3     Student(const Student &stu){
 4         //表示浅拷贝,新地址 name 、 旧地址name 指向同一空间,重复free释放时会报错
 5         this->name = stur.name;
 6         //表示深拷贝,如果有堆成员,必须使用深拷贝
 7         this->name = (char*)malloc(sizeof(char*)*10);
 8         strcpy(this->name,name)
 9     }
10     
11 }
可变参数
 1 //此处count 1.可以表示循环次数,打印时可通过count打印,
 2 void sum(int  count, ...){
 3     //先定义课表参数的动作
 4     va_list  vp;
 5     //执行完此函数之后 vp就有值了
 6     va_start(vp,count);
 7     //取值,类型是int类型,如果int超限,则返回的是系统值
 8     int number = va_arg(vp,int);
 9     
10     cout << number << endl;
11 }

 

 

 

标签:10,name,int,age,C++,学习,Person,cout
From: https://www.cnblogs.com/wangybs/p/17483800.html

相关文章

  • C++学习(三)
    static静态修饰的变量,必须先声明,再实现,例如1classPerson{2public:3starticintage;4starticinitAge(){5//运行异常6age=10;7}8}91011正确写法12classPerson......
  • C++学习(四)
    对象继承1#include<iostream>2usingnamespacestd;34classPerson{5public:6intage;7char*name;8Person(char*name,intage){}9};10//类默认是私有的11//public:公开继承,不加public会导致main()函数中student.age无法引用......
  • 学习Spring必学的Java基础知识----反射
    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”。以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助。):[1]Java反射知识-->SpringIoC[2]属性编辑器,即PropertyEditor......
  • Kong入门学习实践(4)负载均衡与正则路由
    最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。本篇,我们学习快速配置一个最常见的基本功能:负载均衡与正则路由。关于负载均衡所谓负载均衡,就是通过负载均衡算......
  • Hibernate学习笔记
    大小写不敏感持久化类一般被定义为JavaBean,这是推荐的设计,但是并不是必须的。Hibernate也可以直接访问这些field。所有的持久化类(persistentclasses)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。映射文件一个映射文件看起来像这样<hibernate-mapping>......
  • python篇-工业相机学习
    1,抠出屏的图importcv2fromPILimportImagedefgetCoordinate(img):rectangle=[]gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度图ret,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化element3=......
  • vue学习记录 4
    本地服务器配置apache安装学习参考网址:(官网下载apache包的时候可能会疯狂断开链接)教程里没说,但是要管理员身份操作cmd。https://blog.csdn.net/qqhruchen/article/details/127457889?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefaul......
  • 「学习笔记」三角函数
    有关三角函数的公式、转化、证明等等\[\sin^2\alpha+\cos^2\alpha=1\\\dfrac{\sin\alpha}{\cos\alpha}=\tan\alpha\\(\sin\alpha\pm\cos\alpha)^2=1\pm2\sin\alpha\cos\alpha\\\sin\alpha=\cos\alpha\tan\alpha\\\sin......
  • redis学习八:数据类型命令及落地运用 (Zset)
    有序,附带分数,适用于排行榜1.zaddkeyscore1v1score2v2新增键值对;zrangezsetstartend查看对应范围值zrangekeystartendwithscores带着分数查看;zrevrangekey倒序查看,用法和zrange类似; 2.zrangebyscorekeyminmax取分数范围内的value;也可以在前面加上(是不......
  • Kafka入门学习
    kafka概述Kafka是一个分布式流媒体平台,类似于消息队列或企业消息传递系统。kafka官网:http://kafka.apache.org/名词解释producer:发布消息的对象称之为主题生产者(Kafkatopicproducer)topic:Kafka将消息分门别类,每一类的消息称之为一个主题(Topic)consumer:订阅消息并处理发布......