String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类

1:String类型

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     //初始化方法
 6     string s1 = "hello";//默认构造方法
 7     string s2(s1);//将s2初始化为s1的一个副本
 8     string s3("value");//将s3初始化为字符串的副本
 9     string s4(10,‘x‘);//将字符串初始化为字符x的10个副本
10     cout << s1 << "\t" << s2 << "\t" << s3 << "\t" << s4 << "\t" << endl;
11     //hello   hello   value   xxxxxxxxxx
12     //string操作
13
14     cout << s1.empty() << endl;//判断字符串是否为空
15     cout << s1.size() << endl;//字符串大小
16     cout << s1[0] << endl;//字符串的第0个字符
17     cout << s1 + s3 << endl;//拼接
18     cout << (s1 == s2) << endl;//判断是否相同
19     s1 = s3;//赋值
20     cout << (s1 == s2) << endl;
21
22     return 0;
23 }

2:static成员

关于static的详细内容可看这篇博客:C++中static关键字作用总结

总的来说static有四个主要作用:

1:隐藏。(static函数,static变量均可)

 1 A.cpp
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 char a = ‘A‘;//加上static可以实现对变量a的数据隐藏
 5 void show()//加上static可以实现对函数show的数据隐藏
 6 {
 7     cout << "我来自A.cpp文件,是一个全局函数" << endl;
 8 }
 9
10
11 main.cpp
12 #include <iostream>
13 using namespace std;
14 int main()
15 {
16     /*
17     由于编译是对单个的文件进行编译,所以在编译一个a.cpp文件的时候,
18     若是要在a.cpp中使用b.cpp中的变量,直接使用则编译肯定会报错的,
19     所以这个时候应该永extern修饰在a.cpp中所使用的b.cpp中的变量,
20     这个时候编译器会忽略这个错误,直到链接的时候("将文件融为一体")
21     会找到b.cpp中的变量,这样便ok了。extern的作用相当于让编译器在编译
22     阶段忽略这个错误
23      extern 的用法可以参考  https://blog.csdn.net/pql925/article/details/82178476
24     */
25     extern char a;//声明要引用的变量的名称
26     cout << a<< endl;//a是全局变量,可以在不同文件里面引用
27     extern int show();//声明要引用的方法的名称。
28     show();//show是全局函数,可以在不同文件里面引用
29     return 0;
30 }

2: 保持变量内容的持久。(static变量中的记忆功能和全局生存期)

 1 #include <iostream>
 2 using namespace std;
 3 void show()
 4 {
 5     static int  a = 10;//a只能被初始化一次,其他的初始化无效
 6     a--;
 7     cout << a <<"\t" ;
 8 }
 9 int main()
10 {
11     for(int i = 0; i < 10;i++)
12     {
13         show();
14     }//9       8       7       6       5       4       3       2       1       0
15     return 0;
16 }

3: static的第三个作用是默认初始化为0(static变量)

 1 #include <iostream>
 2 using namespace std;
 3 void show()
 4 {
 5     static int  a;//默认为0
 6     cout << a <<"\t" ;//0
 7 }
 8 int main()
 9 {
10     show();
11     return 0;
12 }

4: 类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。

 1  public:
 2         void static show()
 3         {
 4             height = 10;//静态方法里只能有静态成员或函数
 5             age = 100;//报错。。
 6         }
 7     protected:
 8
 9     private:
10         string color;
11         int age;
12         static int height;

3:动态内存分配

malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放

相关内存分配知识可看一下这几篇博客:

https://blog.csdn.net/questionhahaha/article/details/89462925

https://blog.csdn.net/ladybai/article/details/51234300

https://blog.csdn.net/qq_40416052/article/details/82493916

4:拷贝构造函数

强烈推荐看一下这个博主写的拷贝构造函数,很全面

关于拷贝构造函数和赋值运算符之前的区别和联系(点我)

5:const关键字

 1 #include <bits/stdc++.h>
 2 using namespace std ;
 3
 4 int main()
 5 {
 6     const int a = 1;
 7     //a = 2;            //报错,a是只读的
 8     int b = 0;
 9
10     const int *p = &a;
11     //*p = 2;            //报错,const在*左边,指针所指的值不可以直接修改。
12     p = &b;             //正确,const在*左边可以修改指针所指的地址
13
14     int* const p2 = &b;
15     *p2 = 2;             //正确,const在*右边可以修改指针的值
16      //p2 = &b;           //错误,const在*右边不可以修改指针所指的地址
17
18     return 0;
19 }

 1 #include <bits/stdc++.h>
 2 using namespace std ;
 3 class Data{
 4 public:
 5     Data():SIZE(0)//const变量要进行初始化列表
 6     {
 7         val = 100;
 8     }
 9     int getValue() const
10     {
11         //int val++;            //报错,const声明的函数,局部变量不能修改。
12         return val;
13     }
14 private:
15     const int SIZE;
16     int val;
17 };
18 int main()
19 {
20     Data data;
21     cout << data.getValue();
22     return 0;
23 }

后一个效率更高,避免了一次拷贝构造

关于const的详细总结可以参考这篇博客

6:友元函数与友元类

这篇博客有较详细的总结

原文地址:https://www.cnblogs.com/henuliulei/p/11704820.html

时间: 2024-11-11 12:00:57

String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类的相关文章

28._动态内存分配

动态内存分配 传统数组的缺点(静态内存分配):   1.数组长度必须事先指定,且只能是常整数,不能是变量    例子:     int a[5]; //OK     int len = 5; int a[len]; //error   2.传统形式定义的数组,该数组的内存程序员无法手动编    程释放,在一个函数运行期间,系统为该函数中数组所     分配的空间会一直存在,直到该函数运行完毕时,数组    元素所占存储空间才会被系统释放 3.数组的长度一旦定义,长度就能被改变     4.A函数

C++内存分配和拷贝构造函数写研究

昨晚参加笔试,开错题,有印象中的概念,但目前尚不清楚是怎么回事,什么原理,导致错误的话题.现在总结. 一.C++写内存分配研究 问题考察例如以下,请先不要看答案,看看你是否能做对,呵呵: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG91cWQyMDEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 怎么样.晕了没?正确答案及解析例如

C++-类和动态内存分配 大发彩_票平台开发

大发彩_票平台开发 地址一:[hubawl.com]狐霸源码论坛地址二:[bbscherry.com] 类和动态内存分配 动态内存和类 C++在分配内存时是让程序在运行时决定内存分配,而不是在编译时决定. 这样,可根据程序的需要,而不是根据一系列严格的存储类型规则来使用内存.C++使用new和delete运算符来动态控制内存. 1.1. 复习示例和静态类成员 这个程序使用了一个新的存储类型:静态类成员. //strngbad.h#include<iostream>#ifndef STRNGBA

C++ 动态内存分配(6种情况,好几个例子)

1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配: 有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分

Java静态内存与动态内存分配的解析

1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会 自动释放所占用的内存空间. 变量的分配与释放,都无须程序员自行考虑. eg:基本类型,数组 2. 动态内存 用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配. 3. 区别 a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用

《C++ Primer Plus》读书笔记之十—类和动态内存分配

第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的组成部分.注意:静态成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或枚举型const,则可以在类声明中初始化. 2.当使用一个对象来初始化另一个新建对象时,编译器将自动生成一个复制构造函数,因为它创建对象的一个副本.复制构造函数的

C和C指针小记(十六)-动态内存分配

动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. 3)如果输入数组的数据超过来数组的容纳范围,程序必须以一种合理的方式作出响应.但是程序员一般不会做这个判断. 1.2 malloc 和 free malloc 和 free 分别用于执行动态分配内存和释放. stdlib.h 中声明来这两个函数的原型 void malloc( size_t siz

【Cpp】考点·堆栈&amp;动态内存分配

动态内存分配 堆内存分配与释放 C/C++定义了四个内存区间:代码区,全局变量与静态变量区,局部变量区(栈区),动态内存区(堆区) 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配.有些操作对象只在程序运行时才确定,这样编译时无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配.所有动态存储分配都在堆区中进行. 当程序运行到需要一

Lesson(DynamicMerry)动态内存分配

//  main.m //  1-27随堂笔记 //讲师: 小辉 //笔者: 王学文 //  Created by lanouhn on 15/1/27. //  Copyright (c) 2015年 lanouhn. All rights reserved. //动态内存分配(DynamicMerry) #import <Foundation/Foundation.h> void test() { int x = 10; int y = 20; } //函数返回栈区的数据,是不安全的;一i