c++ 零碎知识点

2024-04-06 03:08
文章标签 c++ 知识点 零碎

本文主要是介绍c++ 零碎知识点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一次看了c++,发现和java还是有很多的不同的。在这里列举出一点点自己找到的c++看到的概念,做一个总结。
可变参数
形参实参
typedef
指针变量的运算
指向函数的指针
引用
引用传递参数&指针传递参数
指针数组
如何引用结构体
类的新建与方法调用与构造函数
构造函数与析构函数的调用环境
双重指针**

可变参数
va_list va_start va_arg va_end
示例demo:

#include<iostream>
#include<stdarg.h>
using namespace std;
void OutputInfo(int num,...)
{va_list  arguments;                              //定义一个va_list类型变量va_start(arguments,num);while(num--)                                     //读取所有参数的数据{
char* pchData=va_arg(augrments,char*);     //获取字符串数据
int   iData=va_arg(arguments,int);
cout<<pchData<<endl;
cout<<iData<<endl;}va_end(arguments);                                //将不再使用的指针变为null
}
void main()\
{OutputInfo(2,"BeiJing",2008,"Olympic Games",2008);
}//最后输出
BeiJing
2008
Olympic Games
2008
    1. va_list:一个可变参数的数据类型。1. va_list arguments;2. va_start:有两个参数,一个是va_list,一个是参数当前读取参数。1. va_start(arguments ,num);2. num--表示读取往后一个变量

形参实参
形参:在函数被声明和定义时被定义的就叫做形参
实参:在函数被调用时具体赋的值就叫实参
形参实参的区别:
1. 在定义函数时指定的形参在还没有进行函数调用时是不占内存。在被调用之后所占内存也随着销毁
2. 实参应该是确定的值。在调用时将实参的值赋给形参。如果形参是指针类型,就将地址值传递给形参
3. 实参形参的数据类型应该相同
4. 实参和形参之间是单项传递,只能有实 参传递给形参

typedef

1 首先://注意在C和C++里不同在C中定义一个结构体类型要用typedef:typedef struct Student{int a;}Stu;于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)这里的Stu实际上就是struct Student的别名。Stu==struct Student另外这里也可以不写Student(于是也不能struct Student stu1;了,必须是Stu stu1;)typedef struct{int a;}Stu;但在c++里很简单,直接struct Student{int a;};    于是就定义了结构体类型Student,声明变量时直接Student stu2;2.其次:在c++中如果用typedef的话,又会造成区别:struct   Student   {   int   a;   }stu1;//stu1是一个变量  typedef   struct   Student2   {   int   a;   }stu2;//stu2是一个结构体类型=struct Student  使用时可以直接访问stu1.a但是stu2则必须先   stu2 s2;然后               s2.a=10;

指针变量的运算
指针变量的运算是对指针的地址进行运算。int 的地址每个占4个字节,double的地址每个占8个字节
对指针变量进行运算之后取值是取得到的地址上的值

#include <iostream>
using namespace std;
int main()
{int a = 100;int *p = &a;printf("p的地址为:%d\n", p);printf("p的值为:%d\n", *p);printf("--------------------------------\n");p++;printf("p的地址为:%d\n", p);printf("p的值为:%d\n", *p);printf("--------------------------------\n");p--;printf("p的地址为:%d\n", p);printf("p的值为:%d\n", *p);printf("--------------------------------\n");p--;printf("p的地址为:%d\n", p);printf("p的值为:%d\n", *p);return 0;
}

这里写图片描述

#include <iostream>
using namespace std;
int main()
{double a = 100.0;double *p = &a;printf("p的地址为:%d\n", p);printf("p的值为:%f\n", *p);printf("--------------------------------\n");p++;printf("p的地址为:%d\n", p);printf("p的值为:%f\n", *p);printf("--------------------------------\n");p--;printf("p的地址为:%d\n", p);printf("p的值为:%f\n", *p);printf("--------------------------------\n");p--;printf("p的地址为:%d\n", p);printf("p的值为:%f\n", *p);return 0;
}

这里写图片描述
指向函数的指针

#include <iostream>
#include<iomanip>
using namespace std;
int avg(int a,int b);//定义一个函数
int main()
{int a, b, r;a = 10;b = 30;int(*f)(int, int);//新建函数指针f = avg;//指向一个函数r = (*f)(a,b);printf("r = %d",r);return 0;
}int avg(int a, int b)//函数的实现
{return (a+b)/2;
}

这里写图片描述

引用
引用是一种隐式指针,为对象建立一个别明年,通过&进行实现。调用这个引用相当于调用被引用对象自己一样。

#include <iostream>
#include<iomanip>
using namespace std;
void main()
{int a;int &ref_a = a;a = 100;cout << "a=" << a << endl;cout << "ref_a=" << ref_a << endl;a = 2;cout << "a=" << a << endl;cout << "ref_a=" << ref_a << endl;int b = 20;ref_a = b;cout << "a=" << a << endl;cout << "ref_a=" << ref_a << endl;ref_a--;cout << "a=" << a << endl;cout << "ref_a=" << ref_a << endl;
}

这里写图片描述

引用传递参数&指针传递参数

函数的参数传递方式有两种,一种是值传递,一种是引用传递。
值传递是把值直接传入到调用函数中。这样不会改变原有值。
引用传递是把引用方式传递进入,效果与值传递刚好相反。会引起原始值的改变。
指针传递参数的效果与引用传递参数一样。#include <iostream>
#include<iomanip>
using namespace std;
void swapp(int &x, int  &y)//引用传递
{int temp;temp = x;x = y;y = temp;
}
void main()
{int a,b;cout << "intput two number " << endl;cin >> a;cin >> b;if (a<b){swapp(a,b);}cout << "a= " << a << endl;cout << "b= " << b << endl;
}

这里写图片描述

#include <iostream>
#include<iomanip>
using namespace std;
void swapp(int *x, int  *y)//指针传递
{int temp;temp = *x;*x = *y;*y = temp;
}
void main()
{int a,b;int *p_a, *p_b;cout << "intput two number " << endl;cin >> a;cin >> b;p_a = &a;p_b = &b;if (a<b){swapp(p_a, p_b);}cout << "a= " << a << endl;cout << "b= " << b << endl;
}

指针数组
指针数组存储的是一系类的指针集合,其元素是指向指针的指针。
想要取得指针数组里面元素的值,只需要对其进行两次取值就可以。例如**p;

如何引用结构体
有两种方式,一种是 ->

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<iomanip>
using namespace std;void main()
{struct PersonInfo{int index;char name[32];short age;} pInfo;pInfo.index = 0;pInfo.age = 20;strcpy(pInfo.name, "张三");cout << "index= " << pInfo.index << endl;cout << "name= " << pInfo.name << endl;cout << "age= " << pInfo.age << endl;
}

这里写图片描述
另一种是 ->

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<iomanip>
using namespace std;void main()
{struct PersonInfo{int index;char name[32];short age;}*pPersonInfo, pInfo = {0,"张三",20};//可直接生成一个指针变量,也可以在定义时直接赋值直接赋值。//指针变量需要在初始化之后才可使用pPersonInfo = &pInfo;//指针变量的引用方式 ->cout << "index= " << pPersonInfo->index << endl;cout << "name= " << pPersonInfo->name << endl;cout << "age= " << pPersonInfo->age << endl;
}

这里写图片描述

类的新建与方法调用与构造函数

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<iomanip>
using namespace std;/****新建的类需要放在调用或者新建的那个地方的前面。如若放在后面就会引用不到。报错*/
class CPerson
{
public:CPerson();~CPerson();CPerson(int index, short shAge, double dSalary);int iIndex;short m_shAge;double m_dSalary;int getIindex();short getAge();double getSalary();
private:};CPerson::CPerson()
{iIndex = 0;m_shAge = 10;m_dSalary = 1000;}CPerson::~CPerson()
{
}CPerson::CPerson(int index, short shAge, double dSalary)
{iIndex = index;m_shAge = shAge;m_dSalary = dSalary;
}int CPerson::getIindex()
{return iIndex;
}short CPerson::getAge()
{return m_shAge;
}double CPerson::getSalary()
{return m_dSalary;
}void main()
{CPerson p1;//默认无参构造函数,声明是自动调用cout << "index= " <<p1.getIindex() << endl;CPerson p2(1,20,1000);//有参构造函数,声明时需要给定参数cout << "index= " << p2.getIindex() << endl;p2 = p1;cout << "index= " << p2.getIindex() << endl;
}

这里写图片描述

构造函数与析构函数的调用环境

1. 自动变量的作用域是某个模块,当此模块被激活时调用自动变量构造函数,,当退出此模块时会调用析构函数
2. 全局变量在进入main函数之前会调用构造函数。在程序终止时会调用析构函数
3. 动态分配的对象在使用new为对象分配的时候调用构造函数,使用delete删除对象的时候调用析构函数
4. 临时变量是为了支持计算,油编译器自动产生。临时变量的生存周期起始和终止会调用够着函数和析构函数 

双重指针**
双重指针,就是一个指针存储的地址指向的也是一个指针。
给个例子:

int number;//这是一个普通的变量
int *p2n=&number;//这是一个指针,他存储的地址是变量number的地址,通过这个地址,可以定位到number这个变量
int **p2p=&p2n;//这是一个指针的指针,他存储的地址是指针变量p2n的地址,通过他,可以确定p2n这个指针bianliang。
void **pp1 = (void **)&aa;//void 是指,这个变量pp1存储的地址,不确定一个具体的类型,你可以在必要的时候使用(类型 **)的方式进行类型转换。

这篇关于c++ 零碎知识点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878853

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c