Краткое описание C++ (4)

строка С++

C++ предоставляет два типа строковых представлений:

  • Строки в стиле C
  • Тип класса string, представленный в C++.

Строки в стиле C

Строки в стиле C возникли на языке C и продолжают поддерживаться в C++. Строки на самом деле представляют собой \0одномерные массивы символов с нулевым завершением. Таким образом, строка с нулевым завершением содержит символы, составляющие строку.

Следующее объявление и инициализация создают HELLOстроку. HELLOРазмер массива символов на единицу больше количества символов в слове из-за нулевого символа, хранящегося в конце массива .

char site[6] = {
    
    'H', 'E', 'L', 'L', 'O', '\0'};

пример

#include <iostream>
 
using namespace std;
 
int main ()
{
    
    
   char site[6] = {
    
    'H', 'E', 'L', 'L', 'O', '\0'};
 
   cout << "你好: ";
   cout << site << endl;
 
   return 0;
}

выход

你好: HELLO

В C++ существует большое количество функций для работы со строками, завершающимися нулем:

пример

#include <iostream>
#include <cstring>
 
using namespace std;
 
int main ()
{
    
    
   char str1[13] = "hello";
   char str2[13] = "google";
   char str3[13];
   int  len ;
 
   // 复制 str1 到 str3
   strcpy( str3, str1);
   cout << "strcpy( str3, str1) : " << str3 << endl;
 
   // 连接 str1 和 str2
   strcat( str1, str2);
   cout << "strcat( str1, str2): " << str1 << endl;
 
   // 连接后,str1 的总长度
   len = strlen(str1);
   cout << "strlen(str1) : " << len << endl;
 
   return 0;
}

Приведенный выше код компилируется и выполняется, давая следующий результат:

strcpy( str3, str1) : hello
strcat( str1, str2): hellogoogle
strlen(str1) : 11

Строковый класс в C++

Стандартная библиотека C++ предоставляет строковый тип класса, который поддерживает все вышеперечисленные операции, а также многие другие.
Пример:

#include <iostream>
#include <string>
 
using namespace std;
 
int main ()
{
    
    
   string str1 = "runoob";
   string str2 = "google";
   string str3;
   int  len ;
 
   // 复制 str1 到 str3
   str3 = str1;
   cout << "str3 : " << str3 << endl;
 
   // 连接 str1 和 str2
   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;
 
   // 连接后,str3 的总长度
   len = str3.size();
   cout << "str3.size() :  " << len << endl;
 
   return 0;
}

Указатели С++

Указатели C++ просты и интересны. Выполнение некоторых задач программирования на C++ можно упростить с помощью указателей, а некоторые задачи, такие как динамическое выделение памяти, невозможно выполнить без указателей.

Каждая переменная имеет ячейку памяти, и каждая ячейка памяти определяет адрес, доступ к которому можно получить с помощью оператора дефиса (&), который представляет адрес в памяти.

пример

#include <iostream>
 
using namespace std;
 
int main ()
{
    
    
   int  var1;
   char var2[10];
 
   cout << "var1 变量的地址: ";
   cout << &var1 << endl;
 
   cout << "var2 变量的地址: ";
   cout << &var2 << endl;
 
   return 0;
}

Приведенный выше код компилируется и выполняется, давая следующий результат:

var1 变量的地址: 0xbfebd5c0
var2 变量的地址: 0xbfebd5b6

Что такое указатели?

Указатель — это переменная, значением которой является адрес другой переменной, то есть прямой адрес ячейки памяти. Как и любую другую переменную или константу, вы должны объявить указатель, прежде чем использовать его для хранения адреса другой переменной. Общая форма объявления переменной-указателя:

type *var-name;

Здесь type — это базовый тип указателя, который должен быть допустимым типом данных C++, а var-name — это имя переменной указателя. Звездочка *, используемая для объявления указателя, аналогична звездочке, используемой при умножении. Однако в этом утверждении звездочка используется для обозначения того, что переменная является указателем. Ниже приведены допустимые объявления указателей:

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

Фактический тип данных всех значений указателя, будь то целое число, число с плавающей запятой, символ или другие типы данных, одинаков и представляет собой длинное шестнадцатеричное число, представляющее адрес памяти. Единственная разница между указателями разных типов данных заключается в том, что тип данных переменной или константы, на которую указывает указатель, различен.

Использование указателей в C++
При использовании указателей часто выполняются следующие операции: определение переменной указателя, присвоение адреса переменной указателю и доступ к значению адреса, доступному в переменной указателя. Это делается с помощью унарных операторов, *возвращающих значение переменной по адресу, указанному операндом.

пример

#include <iostream>
 
using namespace std;
 
int main ()
{
    
    
   int  var = 20;   // 实际变量的声明
   int  *ip;        // 指针变量的声明
 
   ip = &var;       // 在指针变量中存储 var 的地址
 
   cout << "Value of var variable: ";
   cout << var << endl;
 
   // 输出在指针变量中存储的地址
   cout << "Address stored in ip variable: ";
   cout << ip << endl;
 
   // 访问指针中地址的值
   cout << "Value of *ip variable: ";
   cout << *ip << endl;
 
   return 0;
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

&: Адрес ----------------------------------------------- - -------------------------------------------------- -- ----------------------------------------------- * : ценить

Ссылки на С++

Ссылочная переменная — это псевдоним, то есть другое имя существующей переменной. После инициализации ссылки на переменную вы можете использовать имя ссылки или имя переменной, чтобы указать на переменную.

Ссылки на C++ против указателей

Ссылки легко спутать с указателями, и между ними есть три основных различия:

  1. Нулевых ссылок нет. Ссылки должны быть связаны с действительным участком памяти.
  2. Как только ссылка инициализируется для объекта, она не может указывать на другой объект. Указатель может указывать на другой объект в любое время.
  3. Ссылки должны быть инициализированы во время создания. Указатели могут быть инициализированы в любое время.

Создание ссылок в C++.
Думайте об имени переменной как о метке, которую переменная прикрепляет к ячейке памяти, а о ссылке можно думать как о второй метке, которую переменная прикрепляет к ячейке памяти. Таким образом, вы можете получить доступ к содержимому переменной по ее исходному имени или по ссылке. Например:

int i = 17;

Мы можем объявить ссылочную переменную для i следующим образом:

int&  r = i;
double& s = d;

В этих объявлениях & читается как ссылка. Таким образом, первое объявление может читаться как «r — это ссылка на целое число, инициализированное значением i», а второе объявление может читаться как «s — это ссылка на двойное число, инициализированное значением d». В следующем примере используются int и двойные ссылки:

пример

#include <iostream>
 
using namespace std;
 
int main ()
{
    
    
   // 声明简单的变量
   int    i;
   double d;
 
   // 声明引用变量
   int&    r = i;
   double& s = d;
   
   i = 5;
   cout << "Value of i : " << i << endl;
   cout << "Value of i reference : " << r  << endl;
 
   d = 11.7;
   cout << "Value of d : " << d << endl;
   cout << "Value of d reference : " << s  << endl;
   
   return 0;
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7

Использование метода аватара в Наруто в качестве метафоры:

  • Указатель на самом деле больше похож на обычный метод аватара: даже если аватар разобьется, он не повлияет на себя;

  • Ссылки больше похожи на несколько теневых клонов: несколько теневых клонов изменяются и сами подвергаются воздействию.

B ссылается на A: это эквивалентно тому, что B заимствует адрес памяти и значение A, и если какое-либо из A и B изменяется, одновременно изменяется AB.

Указатель B указывает на A: B заимствует значение A, но адрес памяти B перераспределяется, что отличается от адреса A.

Базовый ввод и вывод C++

Стандартная библиотека C++ предоставляет богатый набор функций ввода-вывода, которые описывают самые основные и распространенные операции ввода-вывода в программировании на C++.

Ввод-вывод в C++ происходит в потоках, которые представляют собой последовательности байтов. Если поток байтов передается от устройства (например, клавиатуры, диска, сетевого подключения и т. д.) в память, это называется операцией ввода. Если поток байтов передается из памяти на устройство (например, экран дисплея, принтер, дисковод, сетевое соединение и т. д.), это называется операцией вывода.

Заголовочные файлы библиотеки ввода-вывода

пример

#include <iostream>
 
using namespace std;
 
int main( )
{
    
    
   char str[] = "Hello C++";
 
   cout << "Value of str is : " << str << endl;
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

Value of str is : Hello C++

Компилятор C++ выбирает соответствующий оператор вставки потока для отображения значения на основе типа данных выводимой переменной. Оператор << перегружен для вывода элементов данных встроенных типов (целые числа, числа с плавающей запятой, двойные значения, строки и указатели).

Оператор вставки потока << можно использовать в операторе несколько раз, как показано в примере выше, endl используется для добавления новой строки в конце строки.

пример

#include <iostream>
 
using namespace std;
 
int main( )
{
    
    
   char name[50];
 
   cout << "请输入您的名称: ";
   cin >> name;
   cout << "您的名称是: " << name << endl;
 
}

Когда приведенный выше код компилируется и выполняется, он запрашивает у пользователя имя. Когда пользователь вводит значение и нажимает клавишу Enter, отображаются следующие результаты:

请输入您的名称: cplusplus
您的名称是: cplusplus

В зависимости от типа данных входного значения компилятор C++ выбирает соответствующий оператор извлечения потока для извлечения значения и сохранения его в заданной переменной.

Оператор извлечения потока >> можно использовать в операторе несколько раз. Если требуется ввести несколько данных, можно использовать следующий оператор:

cin >> name >> age;

Это эквивалентно следующим двум утверждениям:

cin >> name;
cin >> age;

Стандартный поток журнала (засор)

Предопределенный объект clog является экземпляром класса iostream. Объект засорения прикрепляется к стандартному устройству вывода, которым обычно является также дисплей, но объект засорения буферизуется. Это означает, что каждый поток, вставленный в засор, сначала сохраняется в буфере и не выводится до тех пор, пока буфер не заполнится или не будет очищен.

clog также используется вместе с оператором вставки потока << следующим образом:

пример

#include <iostream>
 
using namespace std;
 
int main( )
{
    
    
   char str[] = "Unable to read....";
 
   clog << "Error message : " << str << endl;
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

Error message : Unable to read....	

Структуры данных C++

Массивы C/C++ позволяют определять переменные, которые могут хранить элементы данных одного и того же типа, но структуры — это еще один определяемый пользователем тип данных, доступный в C++, который позволяет хранить элементы данных разных типов.

Для представления записи используется структура. Предположим, вы хотите отслеживать активность книг в библиотеке. Возможно, вам потребуется отслеживать следующие свойства каждой книги:

Title :标题
Author :作者
Subject :类目
Book ID :书的 ID

Определение структуры
Чтобы определить структуру, вы должны использовать оператор struct. Оператор struct определяет новый тип данных, который содержит несколько членов.Формат оператора struct следующий:

struct type_name {
    
    
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;

type_name — это имя типа структуры,member_type1member_name1 — это стандартное определение переменной, например int i или float f, или другие допустимые определения переменных. В конце определения структуры, перед последней точкой с запятой, вы можете указать одну или несколько переменных структуры, это необязательно. Ниже необходимо объявить структуру типа Books, переменная — book:

struct Books
{
    
    
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

Доступ к членам структуры
Для доступа к членам структуры мы используем оператор доступа к членам (.). Оператор доступа к члену — это точка между именем переменной структуры и членом структуры, к которому мы хотим получить доступ.

пример

#include <iostream>
#include <cstring>
 
using namespace std;
 
// 声明一个结构体类型 Books 
struct Books
{
    
    
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
    
    
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
   // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Hello"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "World");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 12346;
 
   // 输出 Book1 信息
   cout << "第一本书标题 : " << Book1.title <<endl;
   cout << "第一本书作者 : " << Book1.author <<endl;
   cout << "第一本书类目 : " << Book1.subject <<endl;
   cout << "第一本书 ID : " << Book1.book_id <<endl;
 
   // 输出 Book2 信息
   cout << "第二本书标题 : " << Book2.title <<endl;
   cout << "第二本书作者 : " << Book2.author <<endl;
   cout << "第二本书类目 : " << Book2.subject <<endl;
   cout << "第二本书 ID : " << Book2.book_id <<endl;
 
   return 0;
}

В примере определяется тип структуры Books и две его переменные Book1 и Book2. Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

第一本书标题 : C++ 教程
第一本书作者 : Hello
第一本书类目 : 编程语言
第一本书 ID : 12345
第二本书标题 : CSS 教程
第二本书作者 : World
第二本书类目 : 前端技术
第二本书 ID : 12346

Структуры как аргументы функции

Структуры могут использоваться в качестве параметров функции, а метод передачи параметров аналогичен другим типам переменных или указателей.

пример

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books book );
 
// 声明一个结构体类型 Books 
struct Books
{
    
    
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
    
    
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
    // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Hello"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "World");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 12346;
 
   // 输出 Book1 信息
   printBook( Book1 );
 
   // 输出 Book2 信息
   printBook( Book2 );
 
   return 0;
}
void printBook( struct Books book )
{
    
    
   cout << "书标题 : " << book.title <<endl;
   cout << "书作者 : " << book.author <<endl;
   cout << "书类目 : " << book.subject <<endl;
   cout << "书 ID : " << book.book_id <<endl;
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:

书标题 : C++ 教程
书作者 : Hello
书类目 : 编程语言
书 ID : 12345
书标题 : CSS 教程
书作者 : World
书类目 : 前端技术
书 ID : 12346

Указатели на структуры.
Вы можете определять указатели на структуры аналогично указателям на переменные других типов, следующим образом:

struct Books *struct_pointer;

Адрес структурной переменной может быть сохранен в переменной-указателе, определенной выше. Чтобы найти адрес структурной переменной, поставьте оператор & перед именем структуры:

struct_pointer = &Book1;

Чтобы получить доступ к членам структуры с помощью указателя на эту структуру, ->необходимо использовать оператор:

struct_pointer->title;

Перепишите приведенный выше пример, используя указатели на структуры:

пример

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books *book );
 
struct Books
{
    
    
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
    
    
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
    // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Hello"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "World");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 12346;
 
   // 通过传 Book1 的地址来输出 Book1 信息
   printBook( &Book1 );
 
   // 通过传 Book2 的地址来输出 Book2 信息
   printBook( &Book2 );
 
   return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
    
    
   cout << "书标题  : " << book->title <<endl;
   cout << "书作者 : " << book->author <<endl;
   cout << "书类目 : " << book->subject <<endl;
   cout << "书 ID : " << book->book_id <<endl;
}

ключевое слово typedef

Вот более простой способ определения структур, в которых вы можете «назначать псевдоним» создаваемому вами типу. Например:

typedef struct Books
{
    
    
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;

Books можно использовать напрямую для определения переменных типа Books без использования ключевого слова struct:

Books Book1, Book2;

Неструктурные типы можно определить с помощью ключевого слова typedef следующим образом:

typedef long int *pint32;
 
pint32 x, y, z;

x, y и z — указатели на long int.

Guess you like

Origin blog.csdn.net/weixin_44659309/article/details/131517905